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

Loading…
Cancel
Save