* Reap unreferenced nodes from an in_multi's filter set. */
| 1172 | * Reap unreferenced nodes from an in_multi's filter set. |
| 1173 | */ |
| 1174 | static void |
| 1175 | inm_reap(struct in_multi *inm) |
| 1176 | { |
| 1177 | struct ip_msource *ims, *tims; |
| 1178 | |
| 1179 | RB_FOREACH_SAFE(ims, ip_msource_tree, &inm->inm_srcs, tims) { |
| 1180 | if (ims->ims_st[0].ex > 0 || ims->ims_st[0].in > 0 || |
| 1181 | ims->ims_st[1].ex > 0 || ims->ims_st[1].in > 0 || |
| 1182 | ims->ims_stp != 0) |
| 1183 | continue; |
| 1184 | CTR2(KTR_IGMPV3, "%s: free ims %p", __func__, ims); |
| 1185 | RB_REMOVE(ip_msource_tree, &inm->inm_srcs, ims); |
| 1186 | free(ims, M_IPMSOURCE); |
| 1187 | inm->inm_nsrc--; |
| 1188 | } |
| 1189 | } |
| 1190 | |
| 1191 | /* |
| 1192 | * Purge all source nodes from an in_multi's filter set. |