void delete_single_kernel_cache(mrtentry_t *mrt, kernel_cache_t *node) { if (!mrt || !node) return; if (!node->prev) { mrt->kernel_cache = node->next; if (!mrt->kernel_cache) mrt->flags &= ~(MRTF_KERNEL_CACHE | MRTF_MFC_CLONE_SG); } else { node->prev->next = node->next; } if (node->next) node->next->prev = node->prev; IF_DEBUG(DEBUG_MFC) { logit(LOG_DEBUG, 0, "Deleting MFC entry for source %s and group %s", inet_fmt(node->source, s1, sizeof(s1)), inet_fmt(node->group, s2, sizeof(s2))); } k_del_mfc(igmp_socket, node->source, node->group); free(node); }
void delete_single_kernel_cache_addr(mrtentry_t *mrt, uint32_t source, uint32_t group) { uint32_t source_h; uint32_t group_h; kernel_cache_t *node; if (!mrt) return; source_h = ntohl(source); group_h = ntohl(group); /* Find the exact (S,G) kernel_cache entry */ for (node = mrt->kernel_cache; node; node = node->next) { if (ntohl(node->group) < group_h) continue; if (ntohl(node->group) > group_h) return; /* Not found */ if (ntohl(node->source) < source_h) continue; if (ntohl(node->source) > source_h) return; /* Not found */ /* Found exact match */ break; } if (!node) return; /* Found. Delete it */ if (!node->prev) { mrt->kernel_cache = node->next; if (!mrt->kernel_cache) mrt->flags &= ~(MRTF_KERNEL_CACHE | MRTF_MFC_CLONE_SG); } else{ node->prev->next = node->next; } if (node->next) node->next->prev = node->prev; IF_DEBUG(DEBUG_MFC) { logit(LOG_DEBUG, 0, "Deleting MFC entry for source %s and group %s", inet_fmt(node->source, s1, sizeof(s1)), inet_fmt(node->group, s2, sizeof(s2))); } logit(LOG_DEBUG, 0, "delete_single_kernel_cache_addr: SG"); k_del_mfc(igmp_socket, node->source, node->group); free(node); }
/* * Delete all kernel cache for this mrtentry */ void delete_mrtentry_all_kernel_cache(mrtentry_t *mrt) { kernel_cache_t *prev; kernel_cache_t *node; if (!(mrt->flags & MRTF_KERNEL_CACHE)) return; /* Free all kernel_cache entries */ for (node = mrt->kernel_cache; node; ) { prev = node; node = node->next; k_del_mfc(igmp_socket, prev->source, prev->group); free(prev); } mrt->kernel_cache = NULL; /* turn off the cache flag(s) */ mrt->flags &= ~(MRTF_KERNEL_CACHE | MRTF_MFC_CLONE_SG); }