| 574 | } |
| 575 | |
| 576 | void |
| 577 | rte_rib6_free(struct rte_rib6 *rib) |
| 578 | { |
| 579 | struct rte_tailq_entry *te; |
| 580 | struct rte_rib6_list *rib6_list; |
| 581 | struct rte_rib6_node *tmp = NULL; |
| 582 | |
| 583 | if (unlikely(rib == NULL)) { |
| 584 | rte_errno = EINVAL; |
| 585 | return; |
| 586 | } |
| 587 | |
| 588 | rib6_list = RTE_TAILQ_CAST(rte_rib6_tailq.head, rte_rib6_list); |
| 589 | |
| 590 | rte_mcfg_tailq_write_lock(); |
| 591 | |
| 592 | /* find our tailq entry */ |
| 593 | TAILQ_FOREACH(te, rib6_list, next) { |
| 594 | if (te->data == (void *)rib) |
| 595 | break; |
| 596 | } |
| 597 | if (te != NULL) |
| 598 | TAILQ_REMOVE(rib6_list, te, next); |
| 599 | |
| 600 | rte_mcfg_tailq_write_unlock(); |
| 601 | |
| 602 | while ((tmp = rte_rib6_get_nxt(rib, 0, 0, tmp, |
| 603 | RTE_RIB6_GET_NXT_ALL)) != NULL) |
| 604 | rte_rib6_remove(rib, tmp->ip, tmp->depth); |
| 605 | |
| 606 | rte_mempool_free(rib->node_pool); |
| 607 | |
| 608 | rte_free(rib); |
| 609 | rte_free(te); |
| 610 | } |