| 249 | } |
| 250 | |
| 251 | void |
| 252 | rte_rib6_remove(struct rte_rib6 *rib, |
| 253 | const uint8_t ip[RTE_RIB6_IPV6_ADDR_SIZE], uint8_t depth) |
| 254 | { |
| 255 | struct rte_rib6_node *cur, *prev, *child; |
| 256 | |
| 257 | cur = rte_rib6_lookup_exact(rib, ip, depth); |
| 258 | if (cur == NULL) |
| 259 | return; |
| 260 | |
| 261 | --rib->cur_routes; |
| 262 | cur->flag &= ~RTE_RIB_VALID_NODE; |
| 263 | while (!is_valid_node(cur)) { |
| 264 | if ((cur->left != NULL) && (cur->right != NULL)) |
| 265 | return; |
| 266 | child = (cur->left == NULL) ? cur->right : cur->left; |
| 267 | if (child != NULL) |
| 268 | child->parent = cur->parent; |
| 269 | if (cur->parent == NULL) { |
| 270 | rib->tree = child; |
| 271 | node_free(rib, cur); |
| 272 | return; |
| 273 | } |
| 274 | if (cur->parent->left == cur) |
| 275 | cur->parent->left = child; |
| 276 | else |
| 277 | cur->parent->right = child; |
| 278 | prev = cur; |
| 279 | cur = cur->parent; |
| 280 | node_free(rib, prev); |
| 281 | } |
| 282 | } |
| 283 | |
| 284 | struct rte_rib6_node * |
| 285 | rte_rib6_insert(struct rte_rib6 *rib, |