Merge pull request #10215 from FRRouting/revert-10164-name_change

Revert "pimd: Modifying members of pim_interface to accommodate IPv6 changes"
This commit is contained in:
Stephen Worley 2021-12-15 17:40:53 -05:00 committed by GitHub
commit ad1229a077
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
9 changed files with 176 additions and 163 deletions

View file

@ -508,7 +508,7 @@ static void igmp_show_interfaces(struct pim_instance *pim, struct vty *vty,
if (!pim_ifp) if (!pim_ifp)
continue; continue;
for (ALL_LIST_ELEMENTS_RO(pim_ifp->socket_list, sock_node, for (ALL_LIST_ELEMENTS_RO(pim_ifp->igmp_socket_list, sock_node,
igmp)) { igmp)) {
char uptime[10]; char uptime[10];
char query_hhmmss[10]; char query_hhmmss[10];
@ -525,7 +525,7 @@ static void igmp_show_interfaces(struct pim_instance *pim, struct vty *vty,
json_object_string_add(json_row, "upTime", json_object_string_add(json_row, "upTime",
uptime); uptime);
json_object_int_add(json_row, "version", json_object_int_add(json_row, "version",
pim_ifp->version); pim_ifp->igmp_version);
if (igmp->t_igmp_query_timer) { if (igmp->t_igmp_query_timer) {
json_object_boolean_true_add(json_row, json_object_boolean_true_add(json_row,
@ -555,7 +555,7 @@ static void igmp_show_interfaces(struct pim_instance *pim, struct vty *vty,
: "down", : "down",
inet_ntop(AF_INET, &igmp->ifaddr, buf, inet_ntop(AF_INET, &igmp->ifaddr, buf,
sizeof(buf)), sizeof(buf)),
pim_ifp->version, pim_ifp->igmp_version,
igmp->t_igmp_query_timer ? "local" igmp->t_igmp_query_timer ? "local"
: "other", : "other",
&igmp->querier_addr, query_hhmmss, &igmp->querier_addr, query_hhmmss,
@ -610,7 +610,7 @@ static void igmp_show_interfaces_single(struct pim_instance *pim,
if (strcmp(ifname, "detail") && strcmp(ifname, ifp->name)) if (strcmp(ifname, "detail") && strcmp(ifname, ifp->name))
continue; continue;
for (ALL_LIST_ELEMENTS_RO(pim_ifp->socket_list, sock_node, for (ALL_LIST_ELEMENTS_RO(pim_ifp->igmp_socket_list, sock_node,
igmp)) { igmp)) {
found_ifname = 1; found_ifname = 1;
pim_time_uptime(uptime, sizeof(uptime), pim_time_uptime(uptime, sizeof(uptime),
@ -625,33 +625,35 @@ static void igmp_show_interfaces_single(struct pim_instance *pim,
gmi_msec = PIM_IGMP_GMI_MSEC( gmi_msec = PIM_IGMP_GMI_MSEC(
igmp->querier_robustness_variable, igmp->querier_robustness_variable,
igmp->querier_query_interval, igmp->querier_query_interval,
pim_ifp->query_max_response_time_dsec); pim_ifp->igmp_query_max_response_time_dsec);
sqi = PIM_IGMP_SQI(pim_ifp->default_query_interval); sqi = PIM_IGMP_SQI(
pim_ifp->igmp_default_query_interval);
oqpi_msec = PIM_IGMP_OQPI_MSEC( oqpi_msec = PIM_IGMP_OQPI_MSEC(
igmp->querier_robustness_variable, igmp->querier_robustness_variable,
igmp->querier_query_interval, igmp->querier_query_interval,
pim_ifp->query_max_response_time_dsec); pim_ifp->igmp_query_max_response_time_dsec);
lmqt_msec = PIM_IGMP_LMQT_MSEC( lmqt_msec = PIM_IGMP_LMQT_MSEC(
pim_ifp->specific_query_max_response_time_dsec, pim_ifp->igmp_specific_query_max_response_time_dsec,
pim_ifp->last_member_query_count); pim_ifp->igmp_last_member_query_count);
ohpi_msec = ohpi_msec =
PIM_IGMP_OHPI_DSEC( PIM_IGMP_OHPI_DSEC(
igmp->querier_robustness_variable, igmp->querier_robustness_variable,
igmp->querier_query_interval, igmp->querier_query_interval,
pim_ifp->query_max_response_time_dsec) pim_ifp->igmp_query_max_response_time_dsec)
* 100; * 100;
qri_msec = pim_ifp->query_max_response_time_dsec * 100; qri_msec = pim_ifp->igmp_query_max_response_time_dsec
* 100;
if (pim_ifp->pim_sock_fd >= 0) if (pim_ifp->pim_sock_fd >= 0)
mloop = pim_socket_mcastloop_get( mloop = pim_socket_mcastloop_get(
pim_ifp->pim_sock_fd); pim_ifp->pim_sock_fd);
else else
mloop = 0; mloop = 0;
lmqc = pim_ifp->last_member_query_count; lmqc = pim_ifp->igmp_last_member_query_count;
if (uj) { if (uj) {
json_row = json_object_new_object(); json_row = json_object_new_object();
@ -674,7 +676,7 @@ static void igmp_show_interfaces_single(struct pim_instance *pim,
"queryOtherTimer", "queryOtherTimer",
other_hhmmss); other_hhmmss);
json_object_int_add(json_row, "version", json_object_int_add(json_row, "version",
pim_ifp->version); pim_ifp->igmp_version);
json_object_int_add( json_object_int_add(
json_row, json_row,
"timerGroupMembershipIntervalMsec", "timerGroupMembershipIntervalMsec",
@ -725,7 +727,7 @@ static void igmp_show_interfaces_single(struct pim_instance *pim,
&pim_ifp->primary_address); &pim_ifp->primary_address);
vty_out(vty, "Uptime : %s\n", uptime); vty_out(vty, "Uptime : %s\n", uptime);
vty_out(vty, "Version : %d\n", vty_out(vty, "Version : %d\n",
pim_ifp->version); pim_ifp->igmp_version);
vty_out(vty, "\n"); vty_out(vty, "\n");
vty_out(vty, "\n"); vty_out(vty, "\n");
@ -831,14 +833,15 @@ static void igmp_show_interface_join(struct pim_instance *pim, struct vty *vty,
if (!pim_ifp) if (!pim_ifp)
continue; continue;
if (!pim_ifp->join_list) if (!pim_ifp->igmp_join_list)
continue; continue;
pri_addr = pim_find_primary_addr(ifp); pri_addr = pim_find_primary_addr(ifp);
pim_inet4_dump("<pri?>", pri_addr, pri_addr_str, pim_inet4_dump("<pri?>", pri_addr, pri_addr_str,
sizeof(pri_addr_str)); sizeof(pri_addr_str));
for (ALL_LIST_ELEMENTS_RO(pim_ifp->join_list, join_node, ij)) { for (ALL_LIST_ELEMENTS_RO(pim_ifp->igmp_join_list, join_node,
ij)) {
char group_str[INET_ADDRSTRLEN]; char group_str[INET_ADDRSTRLEN];
char source_str[INET_ADDRSTRLEN]; char source_str[INET_ADDRSTRLEN];
char uptime[10]; char uptime[10];
@ -884,7 +887,7 @@ static void igmp_show_interface_join(struct pim_instance *pim, struct vty *vty,
ifp->name, pri_addr_str, source_str, ifp->name, pri_addr_str, source_str,
group_str, ij->sock_fd, uptime); group_str, ij->sock_fd, uptime);
} }
} /* for (pim_ifp->join_list) */ } /* for (pim_ifp->igmp_join_list) */
} /* for (iflist) */ } /* for (iflist) */
@ -1337,7 +1340,7 @@ static void igmp_show_statistics(struct pim_instance *pim, struct vty *vty,
if (ifname && strcmp(ifname, ifp->name)) if (ifname && strcmp(ifname, ifp->name))
continue; continue;
for (ALL_LIST_ELEMENTS_RO(pim_ifp->socket_list, sock_node, for (ALL_LIST_ELEMENTS_RO(pim_ifp->igmp_socket_list, sock_node,
igmp)) { igmp)) {
igmp_stats_add(&rx_stats, &igmp->rx_stats); igmp_stats_add(&rx_stats, &igmp->rx_stats);
} }
@ -3426,7 +3429,8 @@ static void igmp_show_groups(struct pim_instance *pim, struct vty *vty, bool uj)
continue; continue;
/* scan igmp groups */ /* scan igmp groups */
for (ALL_LIST_ELEMENTS_RO(pim_ifp->group_list, grpnode, grp)) { for (ALL_LIST_ELEMENTS_RO(pim_ifp->igmp_group_list, grpnode,
grp)) {
char group_str[INET_ADDRSTRLEN]; char group_str[INET_ADDRSTRLEN];
char hhmmss[10]; char hhmmss[10];
char uptime[10]; char uptime[10];
@ -3519,7 +3523,8 @@ static void igmp_show_group_retransmission(struct pim_instance *pim,
continue; continue;
/* scan igmp groups */ /* scan igmp groups */
for (ALL_LIST_ELEMENTS_RO(pim_ifp->group_list, grpnode, grp)) { for (ALL_LIST_ELEMENTS_RO(pim_ifp->igmp_group_list, grpnode,
grp)) {
char group_str[INET_ADDRSTRLEN]; char group_str[INET_ADDRSTRLEN];
char grp_retr_mmss[10]; char grp_retr_mmss[10];
struct listnode *src_node; struct listnode *src_node;
@ -3571,7 +3576,8 @@ static void igmp_show_sources(struct pim_instance *pim, struct vty *vty)
continue; continue;
/* scan igmp groups */ /* scan igmp groups */
for (ALL_LIST_ELEMENTS_RO(pim_ifp->group_list, grpnode, grp)) { for (ALL_LIST_ELEMENTS_RO(pim_ifp->igmp_group_list, grpnode,
grp)) {
char group_str[INET_ADDRSTRLEN]; char group_str[INET_ADDRSTRLEN];
struct listnode *srcnode; struct listnode *srcnode;
struct gm_source *src; struct gm_source *src;
@ -3604,7 +3610,7 @@ static void igmp_show_sources(struct pim_instance *pim, struct vty *vty)
uptime); uptime);
} /* scan group sources */ } /* scan group sources */
} /* scan igmp groups */ } /* scan igmp groups */
} /* scan interfaces */ } /* scan interfaces */
} }
@ -3626,7 +3632,8 @@ static void igmp_show_source_retransmission(struct pim_instance *pim,
continue; continue;
/* scan igmp groups */ /* scan igmp groups */
for (ALL_LIST_ELEMENTS_RO(pim_ifp->group_list, grpnode, grp)) { for (ALL_LIST_ELEMENTS_RO(pim_ifp->igmp_group_list, grpnode,
grp)) {
char group_str[INET_ADDRSTRLEN]; char group_str[INET_ADDRSTRLEN];
struct listnode *srcnode; struct listnode *srcnode;
struct gm_source *src; struct gm_source *src;
@ -3647,7 +3654,7 @@ static void igmp_show_source_retransmission(struct pim_instance *pim,
src->source_query_retransmit_count); src->source_query_retransmit_count);
} /* scan group sources */ } /* scan group sources */
} /* scan igmp groups */ } /* scan igmp groups */
} /* scan interfaces */ } /* scan interfaces */
} }
@ -3916,9 +3923,9 @@ static void clear_mroute(struct pim_instance *pim)
/* clean up all igmp groups */ /* clean up all igmp groups */
if (pim_ifp->group_list) { if (pim_ifp->igmp_group_list) {
while (pim_ifp->group_list->count) { while (pim_ifp->igmp_group_list->count) {
grp = listnode_head(pim_ifp->group_list); grp = listnode_head(pim_ifp->igmp_group_list);
igmp_group_delete(grp); igmp_group_delete(grp);
} }
} }

View file

@ -124,14 +124,16 @@ struct pim_interface *pim_if_new(struct interface *ifp, bool igmp, bool pim,
pim_ifp->pim = ifp->vrf->info; pim_ifp->pim = ifp->vrf->info;
pim_ifp->mroute_vif_index = -1; pim_ifp->mroute_vif_index = -1;
pim_ifp->version = IGMP_DEFAULT_VERSION; pim_ifp->igmp_version = IGMP_DEFAULT_VERSION;
pim_ifp->default_robustness_variable = IGMP_DEFAULT_ROBUSTNESS_VARIABLE; pim_ifp->igmp_default_robustness_variable =
pim_ifp->default_query_interval = IGMP_GENERAL_QUERY_INTERVAL; IGMP_DEFAULT_ROBUSTNESS_VARIABLE;
pim_ifp->query_max_response_time_dsec = pim_ifp->igmp_default_query_interval = IGMP_GENERAL_QUERY_INTERVAL;
pim_ifp->igmp_query_max_response_time_dsec =
IGMP_QUERY_MAX_RESPONSE_TIME_DSEC; IGMP_QUERY_MAX_RESPONSE_TIME_DSEC;
pim_ifp->specific_query_max_response_time_dsec = pim_ifp->igmp_specific_query_max_response_time_dsec =
IGMP_SPECIFIC_QUERY_MAX_RESPONSE_TIME_DSEC; IGMP_SPECIFIC_QUERY_MAX_RESPONSE_TIME_DSEC;
pim_ifp->last_member_query_count = IGMP_DEFAULT_ROBUSTNESS_VARIABLE; pim_ifp->igmp_last_member_query_count =
IGMP_DEFAULT_ROBUSTNESS_VARIABLE;
/* BSM config on interface: true by default */ /* BSM config on interface: true by default */
pim_ifp->bsm_enable = true; pim_ifp->bsm_enable = true;
@ -143,8 +145,8 @@ struct pim_interface *pim_if_new(struct interface *ifp, bool igmp, bool pim,
The number of seconds represented by the [Query Response Interval] The number of seconds represented by the [Query Response Interval]
must be less than the [Query Interval]. must be less than the [Query Interval].
*/ */
assert(pim_ifp->query_max_response_time_dsec assert(pim_ifp->igmp_query_max_response_time_dsec
< pim_ifp->default_query_interval); < pim_ifp->igmp_default_query_interval);
if (pim) if (pim)
PIM_IF_DO_PIM(pim_ifp->options); PIM_IF_DO_PIM(pim_ifp->options);
@ -153,7 +155,7 @@ struct pim_interface *pim_if_new(struct interface *ifp, bool igmp, bool pim,
PIM_IF_DO_IGMP_LISTEN_ALLROUTERS(pim_ifp->options); PIM_IF_DO_IGMP_LISTEN_ALLROUTERS(pim_ifp->options);
pim_ifp->join_list = NULL; pim_ifp->igmp_join_list = NULL;
pim_ifp->pim_neighbor_list = NULL; pim_ifp->pim_neighbor_list = NULL;
pim_ifp->upstream_switch_list = NULL; pim_ifp->upstream_switch_list = NULL;
pim_ifp->pim_generation_id = 0; pim_ifp->pim_generation_id = 0;
@ -198,7 +200,7 @@ void pim_if_delete(struct interface *ifp)
pim_ifp = ifp->info; pim_ifp = ifp->info;
assert(pim_ifp); assert(pim_ifp);
if (pim_ifp->join_list) { if (pim_ifp->igmp_join_list) {
pim_if_igmp_join_del_all(ifp); pim_if_igmp_join_del_all(ifp);
} }
@ -533,27 +535,27 @@ void pim_if_addr_add(struct connected *ifc)
struct gm_sock *igmp; struct gm_sock *igmp;
/* lookup IGMP socket */ /* lookup IGMP socket */
igmp = pim_igmp_sock_lookup_ifaddr(pim_ifp->socket_list, igmp = pim_igmp_sock_lookup_ifaddr(pim_ifp->igmp_socket_list,
ifaddr); ifaddr);
if (!igmp) { if (!igmp) {
/* if addr new, add IGMP socket */ /* if addr new, add IGMP socket */
if (ifc->address->family == AF_INET) if (ifc->address->family == AF_INET)
pim_igmp_sock_add(pim_ifp->socket_list, ifaddr, pim_igmp_sock_add(pim_ifp->igmp_socket_list,
ifp, false); ifaddr, ifp, false);
} else if (igmp->mtrace_only) { } else if (igmp->mtrace_only) {
igmp_sock_delete(igmp); igmp_sock_delete(igmp);
pim_igmp_sock_add(pim_ifp->socket_list, ifaddr, ifp, pim_igmp_sock_add(pim_ifp->igmp_socket_list, ifaddr,
false); ifp, false);
} }
/* Replay Static IGMP groups */ /* Replay Static IGMP groups */
if (pim_ifp->join_list) { if (pim_ifp->igmp_join_list) {
struct listnode *node; struct listnode *node;
struct listnode *nextnode; struct listnode *nextnode;
struct gm_join *ij; struct gm_join *ij;
int join_fd; int join_fd;
for (ALL_LIST_ELEMENTS(pim_ifp->join_list, node, for (ALL_LIST_ELEMENTS(pim_ifp->igmp_join_list, node,
nextnode, ij)) { nextnode, ij)) {
/* Close socket and reopen with Source and Group /* Close socket and reopen with Source and Group
*/ */
@ -584,14 +586,14 @@ void pim_if_addr_add(struct connected *ifc)
struct gm_sock *igmp; struct gm_sock *igmp;
/* lookup IGMP socket */ /* lookup IGMP socket */
igmp = pim_igmp_sock_lookup_ifaddr(pim_ifp->socket_list, igmp = pim_igmp_sock_lookup_ifaddr(pim_ifp->igmp_socket_list,
ifaddr); ifaddr);
if (ifc->address->family == AF_INET) { if (ifc->address->family == AF_INET) {
if (igmp) if (igmp)
igmp_sock_delete(igmp); igmp_sock_delete(igmp);
/* if addr new, add IGMP socket */ /* if addr new, add IGMP socket */
pim_igmp_sock_add(pim_ifp->socket_list, ifaddr, ifp, pim_igmp_sock_add(pim_ifp->igmp_socket_list, ifaddr,
true); ifp, true);
} }
} /* igmp mtrace only */ } /* igmp mtrace only */
@ -662,7 +664,7 @@ static void pim_if_addr_del_igmp(struct connected *ifc)
ifaddr = ifc->address->u.prefix4; ifaddr = ifc->address->u.prefix4;
/* lookup IGMP socket */ /* lookup IGMP socket */
igmp = pim_igmp_sock_lookup_ifaddr(pim_ifp->socket_list, ifaddr); igmp = pim_igmp_sock_lookup_ifaddr(pim_ifp->igmp_socket_list, ifaddr);
if (igmp) { if (igmp) {
/* if addr found, del IGMP socket */ /* if addr found, del IGMP socket */
igmp_sock_delete(igmp); igmp_sock_delete(igmp);
@ -1243,7 +1245,7 @@ static struct gm_join *igmp_join_new(struct interface *ifp,
ij->source_addr = source_addr; ij->source_addr = source_addr;
ij->sock_creation = pim_time_monotonic_sec(); ij->sock_creation = pim_time_monotonic_sec();
listnode_add(pim_ifp->join_list, ij); listnode_add(pim_ifp->igmp_join_list, ij);
return ij; return ij;
} }
@ -1260,12 +1262,12 @@ ferr_r pim_if_igmp_join_add(struct interface *ifp, struct in_addr group_addr,
ifp->name); ifp->name);
} }
if (!pim_ifp->join_list) { if (!pim_ifp->igmp_join_list) {
pim_ifp->join_list = list_new(); pim_ifp->igmp_join_list = list_new();
pim_ifp->join_list->del = (void (*)(void *))igmp_join_free; pim_ifp->igmp_join_list->del = (void (*)(void *))igmp_join_free;
} }
ij = igmp_join_find(pim_ifp->join_list, group_addr, source_addr); ij = igmp_join_find(pim_ifp->igmp_join_list, group_addr, source_addr);
/* This interface has already been configured to join this IGMP group /* This interface has already been configured to join this IGMP group
*/ */
@ -1304,13 +1306,13 @@ int pim_if_igmp_join_del(struct interface *ifp, struct in_addr group_addr,
return -1; return -1;
} }
if (!pim_ifp->join_list) { if (!pim_ifp->igmp_join_list) {
zlog_warn("%s: no IGMP join on interface %s", __func__, zlog_warn("%s: no IGMP join on interface %s", __func__,
ifp->name); ifp->name);
return -2; return -2;
} }
ij = igmp_join_find(pim_ifp->join_list, group_addr, source_addr); ij = igmp_join_find(pim_ifp->igmp_join_list, group_addr, source_addr);
if (!ij) { if (!ij) {
char group_str[INET_ADDRSTRLEN]; char group_str[INET_ADDRSTRLEN];
char source_str[INET_ADDRSTRLEN]; char source_str[INET_ADDRSTRLEN];
@ -1337,11 +1339,11 @@ int pim_if_igmp_join_del(struct interface *ifp, struct in_addr group_addr,
errno, safe_strerror(errno)); errno, safe_strerror(errno));
/* warning only */ /* warning only */
} }
listnode_delete(pim_ifp->join_list, ij); listnode_delete(pim_ifp->igmp_join_list, ij);
igmp_join_free(ij); igmp_join_free(ij);
if (listcount(pim_ifp->join_list) < 1) { if (listcount(pim_ifp->igmp_join_list) < 1) {
list_delete(&pim_ifp->join_list); list_delete(&pim_ifp->igmp_join_list);
pim_ifp->join_list = 0; pim_ifp->igmp_join_list = 0;
} }
return 0; return 0;
@ -1361,10 +1363,10 @@ static void pim_if_igmp_join_del_all(struct interface *ifp)
return; return;
} }
if (!pim_ifp->join_list) if (!pim_ifp->igmp_join_list)
return; return;
for (ALL_LIST_ELEMENTS(pim_ifp->join_list, node, nextnode, ij)) for (ALL_LIST_ELEMENTS(pim_ifp->igmp_join_list, node, nextnode, ij))
pim_if_igmp_join_del(ifp, ij->group_addr, ij->source_addr); pim_if_igmp_join_del(ifp, ij->group_addr, ij->source_addr);
} }

View file

@ -100,13 +100,13 @@ struct pim_interface {
struct in_addr update_source; /* user can statically set the primary struct in_addr update_source; /* user can statically set the primary
* address of the interface */ * address of the interface */
int version; /* IGMP or MLD version */ int igmp_version; /* IGMP version */
int default_robustness_variable; /* IGMP or MLD QRV */ int igmp_default_robustness_variable; /* IGMPv3 QRV */
int default_query_interval; /* IGMP or MLD secs between general int igmp_default_query_interval; /* IGMPv3 secs between general
queries */ queries */
int query_max_response_time_dsec; /* IGMP or MLD Max Response Time in int igmp_query_max_response_time_dsec; /* IGMPv3 Max Response Time in
dsecs for general queries */ dsecs for general queries */
int specific_query_max_response_time_dsec; /* IGMP or MLD Max Response int igmp_specific_query_max_response_time_dsec; /* IGMPv3 Max Response
Time in dsecs called Time in dsecs called
as last member query as last member query
interval, defines the interval, defines the
@ -114,11 +114,11 @@ struct pim_interface {
advertised in IGMP advertised in IGMP
group-specific group-specific
queries */ queries */
int last_member_query_count; /* IGMP or MLD last member query count */ int igmp_last_member_query_count; /* IGMP last member query count */
struct list *socket_list; /* list of struct IGMP or MLD sock */ struct list *igmp_socket_list; /* list of struct igmp_sock */
struct list *join_list; /* list of struct IGMP or MLD join */ struct list *igmp_join_list; /* list of struct igmp_join */
struct list *group_list; /* list of struct IGMP or MLD group */ struct list *igmp_group_list; /* list of struct igmp_group */
struct hash *group_hash; struct hash *igmp_group_hash;
int pim_sock_fd; /* PIM socket file descriptor */ int pim_sock_fd; /* PIM socket file descriptor */
struct thread *t_pim_sock_read; /* thread for reading PIM socket */ struct thread *t_pim_sock_read; /* thread for reading PIM socket */

View file

@ -226,7 +226,7 @@ void pim_igmp_other_querier_timer_on(struct gm_sock *igmp)
*/ */
other_querier_present_interval_msec = PIM_IGMP_OQPI_MSEC( other_querier_present_interval_msec = PIM_IGMP_OQPI_MSEC(
igmp->querier_robustness_variable, igmp->querier_query_interval, igmp->querier_robustness_variable, igmp->querier_query_interval,
pim_ifp->query_max_response_time_dsec); pim_ifp->igmp_query_max_response_time_dsec);
if (PIM_DEBUG_IGMP_TRACE) { if (PIM_DEBUG_IGMP_TRACE) {
char ifaddr_str[INET_ADDRSTRLEN]; char ifaddr_str[INET_ADDRSTRLEN];
@ -351,10 +351,11 @@ static int igmp_recv_query(struct gm_sock *igmp, int query_version,
* For now we will simplify things and inform the user that they need to * For now we will simplify things and inform the user that they need to
* configure all PIM routers to use the same version of IGMP. * configure all PIM routers to use the same version of IGMP.
*/ */
if (query_version != pim_ifp->version) { if (query_version != pim_ifp->igmp_version) {
zlog_warn( zlog_warn(
"Recv IGMP query v%d from %s on %s but we are using v%d, please configure all PIM routers on this subnet to use the same IGMP version", "Recv IGMP query v%d from %s on %s but we are using v%d, please configure all PIM routers on this subnet to use the same IGMP version",
query_version, from_str, ifp->name, pim_ifp->version); query_version, from_str, ifp->name,
pim_ifp->igmp_version);
return 0; return 0;
} }
@ -635,14 +636,14 @@ void pim_igmp_general_query_on(struct gm_sock *igmp)
* newly configured igmp interface send it out in 1 second * newly configured igmp interface send it out in 1 second
* just to give the entire world a tiny bit of time to settle * just to give the entire world a tiny bit of time to settle
* else the query interval is: * else the query interval is:
* query_interval = pim_ifp->default_query_interval >> 2; * query_interval = pim_ifp->igmp_default_query_interval >> 2;
*/ */
if (igmp->startup_query_count if (igmp->startup_query_count
== igmp->querier_robustness_variable) == igmp->querier_robustness_variable)
query_interval = 1; query_interval = 1;
else else
query_interval = query_interval = PIM_IGMP_SQI(
PIM_IGMP_SQI(pim_ifp->default_query_interval); pim_ifp->igmp_default_query_interval);
--igmp->startup_query_count; --igmp->startup_query_count;
} else { } else {
@ -695,7 +696,7 @@ static int pim_igmp_general_query(struct thread *t)
pim_ifp = igmp->interface->info; pim_ifp = igmp->interface->info;
if (pim_ifp->version == 3) { if (pim_ifp->igmp_version == 3) {
query_buf_size = PIM_IGMP_BUFSIZE_WRITE; query_buf_size = PIM_IGMP_BUFSIZE_WRITE;
} else { } else {
query_buf_size = IGMP_V12_MSG_SIZE; query_buf_size = IGMP_V12_MSG_SIZE;
@ -725,10 +726,10 @@ static int pim_igmp_general_query(struct thread *t)
querier_str, dst_str, igmp->interface->name); querier_str, dst_str, igmp->interface->name);
} }
igmp_send_query(pim_ifp->version, 0 /* igmp_group */, igmp->fd, igmp_send_query(pim_ifp->igmp_version, 0 /* igmp_group */, igmp->fd,
igmp->interface->name, query_buf, sizeof(query_buf), igmp->interface->name, query_buf, sizeof(query_buf),
0 /* num_sources */, dst_addr, group_addr, 0 /* num_sources */, dst_addr, group_addr,
pim_ifp->query_max_response_time_dsec, pim_ifp->igmp_query_max_response_time_dsec,
1 /* s_flag: always set for general queries */, 1 /* s_flag: always set for general queries */,
igmp->querier_robustness_variable, igmp->querier_robustness_variable,
igmp->querier_query_interval); igmp->querier_query_interval);
@ -786,7 +787,7 @@ void igmp_startup_mode_on(struct gm_sock *igmp)
/* /*
Since we're (re)starting, reset QQI to default Query Interval Since we're (re)starting, reset QQI to default Query Interval
*/ */
igmp->querier_query_interval = pim_ifp->default_query_interval; igmp->querier_query_interval = pim_ifp->igmp_default_query_interval;
} }
static void igmp_group_free(struct gm_group *group) static void igmp_group_free(struct gm_group *group)
@ -843,8 +844,8 @@ void igmp_group_delete(struct gm_group *group)
group_timer_off(group); group_timer_off(group);
igmp_group_count_decr(pim_ifp); igmp_group_count_decr(pim_ifp);
listnode_delete(pim_ifp->group_list, group); listnode_delete(pim_ifp->igmp_group_list, group);
hash_release(pim_ifp->group_hash, group); hash_release(pim_ifp->igmp_group_hash, group);
igmp_group_free(group); igmp_group_free(group);
} }
@ -874,11 +875,11 @@ void igmp_sock_delete(struct gm_sock *igmp)
pim_ifp = igmp->interface->info; pim_ifp = igmp->interface->info;
listnode_delete(pim_ifp->socket_list, igmp); listnode_delete(pim_ifp->igmp_socket_list, igmp);
igmp_sock_free(igmp); igmp_sock_free(igmp);
if (!listcount(pim_ifp->socket_list)) if (!listcount(pim_ifp->igmp_socket_list))
pim_igmp_if_reset(pim_ifp); pim_igmp_if_reset(pim_ifp);
} }
@ -890,8 +891,8 @@ void igmp_sock_delete_all(struct interface *ifp)
pim_ifp = ifp->info; pim_ifp = ifp->info;
for (ALL_LIST_ELEMENTS(pim_ifp->socket_list, igmp_node, igmp_nextnode, for (ALL_LIST_ELEMENTS(pim_ifp->igmp_socket_list, igmp_node,
igmp)) { igmp_nextnode, igmp)) {
igmp_sock_delete(igmp); igmp_sock_delete(igmp);
} }
} }
@ -918,15 +919,15 @@ void pim_igmp_if_init(struct pim_interface *pim_ifp, struct interface *ifp)
{ {
char hash_name[64]; char hash_name[64];
pim_ifp->socket_list = list_new(); pim_ifp->igmp_socket_list = list_new();
pim_ifp->socket_list->del = (void (*)(void *))igmp_sock_free; pim_ifp->igmp_socket_list->del = (void (*)(void *))igmp_sock_free;
pim_ifp->group_list = list_new(); pim_ifp->igmp_group_list = list_new();
pim_ifp->group_list->del = (void (*)(void *))igmp_group_free; pim_ifp->igmp_group_list->del = (void (*)(void *))igmp_group_free;
snprintf(hash_name, sizeof(hash_name), "IGMP %s hash", ifp->name); snprintf(hash_name, sizeof(hash_name), "IGMP %s hash", ifp->name);
pim_ifp->group_hash = hash_create(igmp_group_hash_key, pim_ifp->igmp_group_hash = hash_create(
igmp_group_hash_equal, hash_name); igmp_group_hash_key, igmp_group_hash_equal, hash_name);
} }
void pim_igmp_if_reset(struct pim_interface *pim_ifp) void pim_igmp_if_reset(struct pim_interface *pim_ifp)
@ -934,7 +935,7 @@ void pim_igmp_if_reset(struct pim_interface *pim_ifp)
struct listnode *grp_node, *grp_nextnode; struct listnode *grp_node, *grp_nextnode;
struct gm_group *grp; struct gm_group *grp;
for (ALL_LIST_ELEMENTS(pim_ifp->group_list, grp_node, grp_nextnode, for (ALL_LIST_ELEMENTS(pim_ifp->igmp_group_list, grp_node, grp_nextnode,
grp)) { grp)) {
igmp_group_delete(grp); igmp_group_delete(grp);
} }
@ -944,13 +945,13 @@ void pim_igmp_if_fini(struct pim_interface *pim_ifp)
{ {
pim_igmp_if_reset(pim_ifp); pim_igmp_if_reset(pim_ifp);
assert(pim_ifp->group_list); assert(pim_ifp->igmp_group_list);
assert(!listcount(pim_ifp->group_list)); assert(!listcount(pim_ifp->igmp_group_list));
list_delete(&pim_ifp->group_list); list_delete(&pim_ifp->igmp_group_list);
hash_free(pim_ifp->group_hash); hash_free(pim_ifp->igmp_group_hash);
list_delete(&pim_ifp->socket_list); list_delete(&pim_ifp->igmp_socket_list);
} }
static struct gm_sock *igmp_sock_new(int fd, struct in_addr ifaddr, static struct gm_sock *igmp_sock_new(int fd, struct in_addr ifaddr,
@ -977,7 +978,7 @@ static struct gm_sock *igmp_sock_new(int fd, struct in_addr ifaddr,
igmp->t_igmp_query_timer = NULL; igmp->t_igmp_query_timer = NULL;
igmp->t_other_querier_timer = NULL; /* no other querier present */ igmp->t_other_querier_timer = NULL; /* no other querier present */
igmp->querier_robustness_variable = igmp->querier_robustness_variable =
pim_ifp->default_robustness_variable; pim_ifp->igmp_default_robustness_variable;
igmp->sock_creation = pim_time_monotonic_sec(); igmp->sock_creation = pim_time_monotonic_sec();
igmp_stats_init(&igmp->rx_stats); igmp_stats_init(&igmp->rx_stats);
@ -992,7 +993,7 @@ static struct gm_sock *igmp_sock_new(int fd, struct in_addr ifaddr,
/* /*
igmp_startup_mode_on() will reset QQI: igmp_startup_mode_on() will reset QQI:
igmp->querier_query_interval = pim_ifp->default_query_interval; igmp->querier_query_interval = pim_ifp->igmp_default_query_interval;
*/ */
igmp_startup_mode_on(igmp); igmp_startup_mode_on(igmp);
pim_igmp_general_query_on(igmp); pim_igmp_general_query_on(igmp);
@ -1187,7 +1188,7 @@ struct gm_group *find_group_by_addr(struct gm_sock *igmp,
lookup.group_addr.s_addr = group_addr.s_addr; lookup.group_addr.s_addr = group_addr.s_addr;
return hash_lookup(pim_ifp->group_hash, &lookup); return hash_lookup(pim_ifp->igmp_group_hash, &lookup);
} }
struct gm_group *igmp_add_group_by_addr(struct gm_sock *igmp, struct gm_group *igmp_add_group_by_addr(struct gm_sock *igmp,
@ -1245,8 +1246,8 @@ struct gm_group *igmp_add_group_by_addr(struct gm_sock *igmp,
/* initialize new group as INCLUDE {empty} */ /* initialize new group as INCLUDE {empty} */
group->group_filtermode_isexcl = 0; /* 0=INCLUDE, 1=EXCLUDE */ group->group_filtermode_isexcl = 0; /* 0=INCLUDE, 1=EXCLUDE */
listnode_add(pim_ifp->group_list, group); listnode_add(pim_ifp->igmp_group_list, group);
group = hash_get(pim_ifp->group_hash, group, hash_alloc_intern); group = hash_get(pim_ifp->igmp_group_hash, group, hash_alloc_intern);
if (PIM_DEBUG_IGMP_TRACE) { if (PIM_DEBUG_IGMP_TRACE) {
char group_str[INET_ADDRSTRLEN]; char group_str[INET_ADDRSTRLEN];
@ -1319,7 +1320,7 @@ void igmp_send_query_on_intf(struct interface *ifp, int igmp_ver)
zlog_debug("Issuing general query on request on %s", zlog_debug("Issuing general query on request on %s",
ifp->name); ifp->name);
for (ALL_LIST_ELEMENTS_RO(pim_ifp->socket_list, sock_node, igmp)) { for (ALL_LIST_ELEMENTS_RO(pim_ifp->igmp_socket_list, sock_node, igmp)) {
char query_buf[query_buf_size]; char query_buf[query_buf_size];
@ -1327,7 +1328,7 @@ void igmp_send_query_on_intf(struct interface *ifp, int igmp_ver)
igmp->interface->name, query_buf, igmp->interface->name, query_buf,
sizeof(query_buf), 0 /* num_sources */, sizeof(query_buf), 0 /* num_sources */,
dst_addr, group_addr, dst_addr, group_addr,
pim_ifp->query_max_response_time_dsec, pim_ifp->igmp_query_max_response_time_dsec,
1 /* s_flag: always set for general queries */, 1 /* s_flag: always set for general queries */,
igmp->querier_robustness_variable, igmp->querier_robustness_variable,
igmp->querier_query_interval); igmp->querier_query_interval);

View file

@ -65,12 +65,12 @@ static inline long igmp_gmi_msec(struct gm_group *group)
long qrv = 0, qqi = 0; long qrv = 0, qqi = 0;
for (ALL_LIST_ELEMENTS_RO(pim_ifp->socket_list, sock_node, igmp)) { for (ALL_LIST_ELEMENTS_RO(pim_ifp->igmp_socket_list, sock_node, igmp)) {
qrv = MAX(qrv, igmp->querier_robustness_variable); qrv = MAX(qrv, igmp->querier_robustness_variable);
qqi = MAX(qqi, igmp->querier_query_interval); qqi = MAX(qqi, igmp->querier_query_interval);
} }
return PIM_IGMP_GMI_MSEC(qrv, qqi, return PIM_IGMP_GMI_MSEC(qrv, qqi,
pim_ifp->query_max_response_time_dsec); pim_ifp->igmp_query_max_response_time_dsec);
} }
void igmp_group_reset_gmi(struct gm_group *group) void igmp_group_reset_gmi(struct gm_group *group)
@ -984,13 +984,14 @@ static void igmp_send_query_group(struct gm_group *group, char *query_buf,
struct gm_sock *igmp; struct gm_sock *igmp;
struct listnode *sock_node; struct listnode *sock_node;
for (ALL_LIST_ELEMENTS_RO(pim_ifp->socket_list, sock_node, igmp)) { for (ALL_LIST_ELEMENTS_RO(pim_ifp->igmp_socket_list, sock_node, igmp)) {
igmp_send_query(pim_ifp->version, group, igmp->fd, ifp->name, igmp_send_query(
query_buf, query_buf_size, num_sources, pim_ifp->igmp_version, group, igmp->fd, ifp->name,
group->group_addr, group->group_addr, query_buf, query_buf_size, num_sources,
pim_ifp->specific_query_max_response_time_dsec, group->group_addr, group->group_addr,
s_flag, igmp->querier_robustness_variable, pim_ifp->igmp_specific_query_max_response_time_dsec,
igmp->querier_query_interval); s_flag, igmp->querier_robustness_variable,
igmp->querier_query_interval);
} }
} }
@ -1012,7 +1013,7 @@ static void group_retransmit_group(struct gm_group *group)
pim_ifp = group->interface->info; pim_ifp = group->interface->info;
if (pim_ifp->version == 3) { if (pim_ifp->igmp_version == 3) {
query_buf_size = PIM_IGMP_BUFSIZE_WRITE; query_buf_size = PIM_IGMP_BUFSIZE_WRITE;
} else { } else {
query_buf_size = IGMP_V12_MSG_SIZE; query_buf_size = IGMP_V12_MSG_SIZE;
@ -1020,8 +1021,8 @@ static void group_retransmit_group(struct gm_group *group)
char query_buf[query_buf_size]; char query_buf[query_buf_size];
lmqc = pim_ifp->last_member_query_count; lmqc = pim_ifp->igmp_last_member_query_count;
lmqi_msec = 100 * pim_ifp->specific_query_max_response_time_dsec; lmqi_msec = 100 * pim_ifp->igmp_specific_query_max_response_time_dsec;
lmqt_msec = lmqc * lmqi_msec; lmqt_msec = lmqc * lmqi_msec;
/* /*
@ -1090,8 +1091,8 @@ static int group_retransmit_sources(struct gm_group *group,
pim_ifp = group->interface->info; pim_ifp = group->interface->info;
lmqc = pim_ifp->last_member_query_count; lmqc = pim_ifp->igmp_last_member_query_count;
lmqi_msec = 100 * pim_ifp->specific_query_max_response_time_dsec; lmqi_msec = 100 * pim_ifp->igmp_specific_query_max_response_time_dsec;
lmqt_msec = lmqc * lmqi_msec; lmqt_msec = lmqc * lmqi_msec;
/* Scan all group sources */ /* Scan all group sources */
@ -1282,7 +1283,7 @@ static void group_retransmit_timer_on(struct gm_group *group)
pim_ifp = group->interface->info; pim_ifp = group->interface->info;
lmqi_msec = 100 * pim_ifp->specific_query_max_response_time_dsec; lmqi_msec = 100 * pim_ifp->igmp_specific_query_max_response_time_dsec;
if (PIM_DEBUG_IGMP_TRACE) { if (PIM_DEBUG_IGMP_TRACE) {
char group_str[INET_ADDRSTRLEN]; char group_str[INET_ADDRSTRLEN];
@ -1318,7 +1319,7 @@ static void group_query_send(struct gm_group *group)
long lmqc; /* Last Member Query Count */ long lmqc; /* Last Member Query Count */
pim_ifp = group->interface->info; pim_ifp = group->interface->info;
lmqc = pim_ifp->last_member_query_count; lmqc = pim_ifp->igmp_last_member_query_count;
/* lower group timer to lmqt */ /* lower group timer to lmqt */
igmp_group_timer_lower_to_lmqt(group); igmp_group_timer_lower_to_lmqt(group);
@ -1351,8 +1352,8 @@ static void source_query_send_by_flag(struct gm_group *group,
pim_ifp = group->interface->info; pim_ifp = group->interface->info;
lmqc = pim_ifp->last_member_query_count; lmqc = pim_ifp->igmp_last_member_query_count;
lmqi_msec = 100 * pim_ifp->specific_query_max_response_time_dsec; lmqi_msec = 100 * pim_ifp->igmp_specific_query_max_response_time_dsec;
lmqt_msec = lmqc * lmqi_msec; lmqt_msec = lmqc * lmqi_msec;
/* /*
@ -1508,8 +1509,8 @@ void igmp_group_timer_lower_to_lmqt(struct gm_group *group)
pim_ifp = ifp->info; pim_ifp = ifp->info;
ifname = ifp->name; ifname = ifp->name;
lmqi_dsec = pim_ifp->specific_query_max_response_time_dsec; lmqi_dsec = pim_ifp->igmp_specific_query_max_response_time_dsec;
lmqc = pim_ifp->last_member_query_count; lmqc = pim_ifp->igmp_last_member_query_count;
lmqt_msec = PIM_IGMP_LMQT_MSEC( lmqt_msec = PIM_IGMP_LMQT_MSEC(
lmqi_dsec, lmqc); /* lmqt_msec = (100 * lmqi_dsec) * lmqc */ lmqi_dsec, lmqc); /* lmqt_msec = (100 * lmqi_dsec) * lmqc */
@ -1543,8 +1544,8 @@ void igmp_source_timer_lower_to_lmqt(struct gm_source *source)
pim_ifp = ifp->info; pim_ifp = ifp->info;
ifname = ifp->name; ifname = ifp->name;
lmqi_dsec = pim_ifp->specific_query_max_response_time_dsec; lmqi_dsec = pim_ifp->igmp_specific_query_max_response_time_dsec;
lmqc = pim_ifp->last_member_query_count; lmqc = pim_ifp->igmp_last_member_query_count;
lmqt_msec = PIM_IGMP_LMQT_MSEC( lmqt_msec = PIM_IGMP_LMQT_MSEC(
lmqi_dsec, lmqc); /* lmqt_msec = (100 * lmqi_dsec) * lmqc */ lmqi_dsec, lmqc); /* lmqt_msec = (100 * lmqi_dsec) * lmqc */
@ -1716,7 +1717,7 @@ void igmp_v3_recv_query(struct gm_sock *igmp, const char *from_str,
resv_s_qrv = igmp_msg[8]; resv_s_qrv = igmp_msg[8];
qrv = 7 & resv_s_qrv; qrv = 7 & resv_s_qrv;
igmp->querier_robustness_variable = igmp->querier_robustness_variable =
qrv ? qrv : pim_ifp->default_robustness_variable; qrv ? qrv : pim_ifp->igmp_default_robustness_variable;
/* /*
* RFC 3376: 4.1.7. QQIC (Querier's Query Interval Code) * RFC 3376: 4.1.7. QQIC (Querier's Query Interval Code)
@ -1733,7 +1734,7 @@ void igmp_v3_recv_query(struct gm_sock *igmp, const char *from_str,
qqic = igmp_msg[9]; qqic = igmp_msg[9];
qqi = igmp_msg_decode8to16(qqic); qqi = igmp_msg_decode8to16(qqic);
igmp->querier_query_interval = igmp->querier_query_interval =
qqi ? qqi : pim_ifp->default_query_interval; qqi ? qqi : pim_ifp->igmp_default_query_interval;
if (PIM_DEBUG_IGMP_TRACE) { if (PIM_DEBUG_IGMP_TRACE) {
char ifaddr_str[INET_ADDRSTRLEN]; char ifaddr_str[INET_ADDRSTRLEN];

View file

@ -626,8 +626,7 @@ static int pim_mroute_msg(struct pim_instance *pim, const char *buf,
pim_ifp = ifp->info; pim_ifp = ifp->info;
ifaddr = connected_src->u.prefix4; ifaddr = connected_src->u.prefix4;
igmp = pim_igmp_sock_lookup_ifaddr(pim_ifp->socket_list, igmp = pim_igmp_sock_lookup_ifaddr(pim_ifp->igmp_socket_list, ifaddr);
ifaddr);
if (PIM_DEBUG_IGMP_PACKETS) { if (PIM_DEBUG_IGMP_PACKETS) {
zlog_debug( zlog_debug(

View file

@ -86,7 +86,7 @@ static void pim_if_membership_refresh(struct interface *ifp)
*/ */
/* scan igmp groups */ /* scan igmp groups */
for (ALL_LIST_ELEMENTS_RO(pim_ifp->group_list, grpnode, grp)) { for (ALL_LIST_ELEMENTS_RO(pim_ifp->igmp_group_list, grpnode, grp)) {
struct listnode *srcnode; struct listnode *srcnode;
struct gm_source *src; struct gm_source *src;
@ -105,7 +105,7 @@ static void pim_if_membership_refresh(struct interface *ifp)
} }
} /* scan group sources */ } /* scan group sources */
} /* scan igmp groups */ } /* scan igmp groups */
/* /*
* Finally delete every PIM (S,G) entry lacking all state info * Finally delete every PIM (S,G) entry lacking all state info
@ -383,14 +383,14 @@ static void igmp_sock_query_interval_reconfig(struct gm_sock *igmp)
pim_inet4_dump("<ifaddr?>", igmp->ifaddr, ifaddr_str, pim_inet4_dump("<ifaddr?>", igmp->ifaddr, ifaddr_str,
sizeof(ifaddr_str)); sizeof(ifaddr_str));
zlog_debug("%s: Querier %s on %s reconfig query_interval=%d", zlog_debug("%s: Querier %s on %s reconfig query_interval=%d",
__func__, ifaddr_str, ifp->name, __func__, ifaddr_str, ifp->name,
pim_ifp->default_query_interval); pim_ifp->igmp_default_query_interval);
} }
/* /*
* igmp_startup_mode_on() will reset QQI: * igmp_startup_mode_on() will reset QQI:
* igmp->querier_query_interval = pim_ifp->default_query_interval; * igmp->querier_query_interval = pim_ifp->igmp_default_query_interval;
*/ */
igmp_startup_mode_on(igmp); igmp_startup_mode_on(igmp);
} }
@ -430,9 +430,9 @@ static void change_query_interval(struct pim_interface *pim_ifp,
struct listnode *sock_node; struct listnode *sock_node;
struct gm_sock *igmp; struct gm_sock *igmp;
pim_ifp->default_query_interval = query_interval; pim_ifp->igmp_default_query_interval = query_interval;
for (ALL_LIST_ELEMENTS_RO(pim_ifp->socket_list, sock_node, igmp)) { for (ALL_LIST_ELEMENTS_RO(pim_ifp->igmp_socket_list, sock_node, igmp)) {
igmp_sock_query_interval_reconfig(igmp); igmp_sock_query_interval_reconfig(igmp);
igmp_sock_query_reschedule(igmp); igmp_sock_query_reschedule(igmp);
} }
@ -446,11 +446,12 @@ static void change_query_max_response_time(struct pim_interface *pim_ifp,
struct listnode *grp_node; struct listnode *grp_node;
struct gm_group *grp; struct gm_group *grp;
if (pim_ifp->query_max_response_time_dsec if (pim_ifp->igmp_query_max_response_time_dsec
== query_max_response_time_dsec) == query_max_response_time_dsec)
return; return;
pim_ifp->query_max_response_time_dsec = query_max_response_time_dsec; pim_ifp->igmp_query_max_response_time_dsec =
query_max_response_time_dsec;
/* /*
* Below we modify socket/group/source timers in order to quickly * Below we modify socket/group/source timers in order to quickly
@ -459,13 +460,13 @@ static void change_query_max_response_time(struct pim_interface *pim_ifp,
*/ */
/* scan all sockets */ /* scan all sockets */
for (ALL_LIST_ELEMENTS_RO(pim_ifp->socket_list, sock_node, igmp)) { for (ALL_LIST_ELEMENTS_RO(pim_ifp->igmp_socket_list, sock_node, igmp)) {
/* reschedule socket general query */ /* reschedule socket general query */
igmp_sock_query_reschedule(igmp); igmp_sock_query_reschedule(igmp);
} }
/* scan socket groups */ /* scan socket groups */
for (ALL_LIST_ELEMENTS_RO(pim_ifp->group_list, grp_node, grp)) { for (ALL_LIST_ELEMENTS_RO(pim_ifp->igmp_group_list, grp_node, grp)) {
struct listnode *src_node; struct listnode *src_node;
struct gm_source *src; struct gm_source *src;
@ -2587,8 +2588,8 @@ int lib_interface_igmp_version_modify(struct nb_cb_modify_args *args)
return NB_ERR_INCONSISTENCY; return NB_ERR_INCONSISTENCY;
igmp_version = yang_dnode_get_uint8(args->dnode, NULL); igmp_version = yang_dnode_get_uint8(args->dnode, NULL);
old_version = pim_ifp->version; old_version = pim_ifp->igmp_version;
pim_ifp->version = igmp_version; pim_ifp->igmp_version = igmp_version;
/* Current and new version is different refresh existing /* Current and new version is different refresh existing
* membership. Going from 3 -> 2 or 2 -> 3. * membership. Going from 3 -> 2 or 2 -> 3.
@ -2615,7 +2616,7 @@ int lib_interface_igmp_version_destroy(struct nb_cb_destroy_args *args)
case NB_EV_APPLY: case NB_EV_APPLY:
ifp = nb_running_get_entry(args->dnode, NULL, true); ifp = nb_running_get_entry(args->dnode, NULL, true);
pim_ifp = ifp->info; pim_ifp = ifp->info;
pim_ifp->version = IGMP_DEFAULT_VERSION; pim_ifp->igmp_version = IGMP_DEFAULT_VERSION;
break; break;
} }
@ -2689,7 +2690,7 @@ int lib_interface_igmp_last_member_query_interval_modify(
pim_ifp = ifp->info; pim_ifp = ifp->info;
last_member_query_interval = last_member_query_interval =
yang_dnode_get_uint16(args->dnode, NULL); yang_dnode_get_uint16(args->dnode, NULL);
pim_ifp->specific_query_max_response_time_dsec = pim_ifp->igmp_specific_query_max_response_time_dsec =
last_member_query_interval; last_member_query_interval;
break; break;
@ -2718,7 +2719,7 @@ int lib_interface_igmp_robustness_variable_modify(
pim_ifp = ifp->info; pim_ifp = ifp->info;
last_member_query_count = yang_dnode_get_uint8(args->dnode, last_member_query_count = yang_dnode_get_uint8(args->dnode,
NULL); NULL);
pim_ifp->last_member_query_count = last_member_query_count; pim_ifp->igmp_last_member_query_count = last_member_query_count;
break; break;
} }

View file

@ -358,55 +358,56 @@ int pim_interface_config_write(struct vty *vty)
} }
/* ip igmp version */ /* ip igmp version */
if (pim_ifp->version != IGMP_DEFAULT_VERSION) { if (pim_ifp->igmp_version
!= IGMP_DEFAULT_VERSION) {
vty_out(vty, " ip igmp version %d\n", vty_out(vty, " ip igmp version %d\n",
pim_ifp->version); pim_ifp->igmp_version);
++writes; ++writes;
} }
/* IF ip igmp query-max-response-time */ /* IF ip igmp query-max-response-time */
if (pim_ifp->query_max_response_time_dsec if (pim_ifp->igmp_query_max_response_time_dsec
!= IGMP_QUERY_MAX_RESPONSE_TIME_DSEC) { != IGMP_QUERY_MAX_RESPONSE_TIME_DSEC) {
vty_out(vty, vty_out(vty,
" ip igmp query-max-response-time %d\n", " ip igmp query-max-response-time %d\n",
pim_ifp->query_max_response_time_dsec); pim_ifp->igmp_query_max_response_time_dsec);
++writes; ++writes;
} }
/* IF ip igmp query-interval */ /* IF ip igmp query-interval */
if (pim_ifp->default_query_interval if (pim_ifp->igmp_default_query_interval
!= IGMP_GENERAL_QUERY_INTERVAL) { != IGMP_GENERAL_QUERY_INTERVAL) {
vty_out(vty, vty_out(vty,
" ip igmp query-interval %d\n", " ip igmp query-interval %d\n",
pim_ifp->default_query_interval); pim_ifp->igmp_default_query_interval);
++writes; ++writes;
} }
/* IF ip igmp last-member_query-count */ /* IF ip igmp last-member_query-count */
if (pim_ifp->last_member_query_count if (pim_ifp->igmp_last_member_query_count
!= IGMP_DEFAULT_ROBUSTNESS_VARIABLE) { != IGMP_DEFAULT_ROBUSTNESS_VARIABLE) {
vty_out(vty, vty_out(vty,
" ip igmp last-member-query-count %d\n", " ip igmp last-member-query-count %d\n",
pim_ifp->last_member_query_count); pim_ifp->igmp_last_member_query_count);
++writes; ++writes;
} }
/* IF ip igmp last-member_query-interval */ /* IF ip igmp last-member_query-interval */
if (pim_ifp->specific_query_max_response_time_dsec if (pim_ifp->igmp_specific_query_max_response_time_dsec
!= IGMP_SPECIFIC_QUERY_MAX_RESPONSE_TIME_DSEC) { != IGMP_SPECIFIC_QUERY_MAX_RESPONSE_TIME_DSEC) {
vty_out(vty, vty_out(vty,
" ip igmp last-member-query-interval %d\n", " ip igmp last-member-query-interval %d\n",
pim_ifp->specific_query_max_response_time_dsec); pim_ifp->igmp_specific_query_max_response_time_dsec);
++writes; ++writes;
} }
/* IF ip igmp join */ /* IF ip igmp join */
if (pim_ifp->join_list) { if (pim_ifp->igmp_join_list) {
struct listnode *node; struct listnode *node;
struct gm_join *ij; struct gm_join *ij;
for (ALL_LIST_ELEMENTS_RO( for (ALL_LIST_ELEMENTS_RO(
pim_ifp->join_list, node, pim_ifp->igmp_join_list,
ij)) { node, ij)) {
char group_str[INET_ADDRSTRLEN]; char group_str[INET_ADDRSTRLEN];
char source_str char source_str
[INET_ADDRSTRLEN]; [INET_ADDRSTRLEN];

View file

@ -554,7 +554,8 @@ void igmp_source_forward_reevaluate_all(struct pim_instance *pim)
continue; continue;
/* scan igmp groups */ /* scan igmp groups */
for (ALL_LIST_ELEMENTS_RO(pim_ifp->group_list, grpnode, grp)) { for (ALL_LIST_ELEMENTS_RO(pim_ifp->igmp_group_list, grpnode,
grp)) {
struct listnode *srcnode; struct listnode *srcnode;
struct gm_source *src; struct gm_source *src;