Browse Source

Optimization in igmp_remove_group() pointed out by Axel Lin

No need to handle special case "first in list" since this is always the allsystems group that shall not be removed
STABLE-2_1_x
Dirk Ziegelmeier 9 years ago
parent
commit
5c1dd6a4c6
  1. 30
      src/core/ipv4/igmp.c

30
src/core/ipv4/igmp.c

@ -295,24 +295,24 @@ static err_t
igmp_remove_group(struct netif* netif, struct igmp_group *group)
{
err_t err = ERR_OK;
struct igmp_group *tmp_group = netif_igmp_data(netif);
/* Is it the first group? */
if (netif_igmp_data(netif) == group) {
netif_set_client_data(netif, LWIP_NETIF_CLIENT_DATA_INDEX_IGMP, group->next);
} else {
/* look for group further down the list */
struct igmp_group *tmpGroup;
for (tmpGroup = netif_igmp_data(netif); tmpGroup != NULL; tmpGroup = tmpGroup->next) {
if (tmpGroup->next == group) {
tmpGroup->next = group->next;
break;
}
}
/* Group not found in the global igmp_group_list */
if (tmpGroup == NULL) {
err = ERR_ARG;
/* Skip the first group in the list, it is always the allsystems group added in igmp_start() */
if(tmp_group != NULL) {
tmp_group = tmp_group->next;
}
/* look for group further down the list */
for (; tmp_group != NULL; tmp_group = tmp_group->next) {
if (tmp_group->next == group) {
tmp_group->next = group->next;
break;
}
}
/* Group not found in the global igmp_group_list */
if (tmp_group == NULL) {
err = ERR_ARG;
}
return err;
}

Loading…
Cancel
Save