Skip to content

Commit

Permalink
Update the less specific route node with requested values
Browse files Browse the repository at this point in the history
It has been observed that if the less specific route is deleted first
and then all the more specific routes, the less specific route doesn't
go away. For e.g.: if 1.1.1.0/24 is deleted first and later 1.1.1.1/32
in a table where there are no other routes, 1.1.1.0/24 remains in the
table.

When we delete a non leaf node, if it is a bucket we do not update the
prefix length, flags and label values. If these values do not match with
those of other nodes in the same bucket, then the bucket will remain
forever. Hence, update the node with the values in the request before
traversing the tree down.

Change-Id: I71778a83093a04c462b40e6c7e05b1d993f3373e
Closes-BUG: #1563734
  • Loading branch information
anandhk-juniper committed Mar 31, 2016
1 parent a4a9308 commit 89ed949
Showing 1 changed file with 11 additions and 6 deletions.
17 changes: 11 additions & 6 deletions dp-core/vr_ip_mtrie.c
Original file line number Diff line number Diff line change
Expand Up @@ -500,8 +500,10 @@ __mtrie_delete(struct vr_route_req *rt, struct ip_bucket_entry *ent,
(ip_bkt_info[level].bi_pfx_len - ip_bkt_info[level].bi_bits)) &&
(rt->rtr_req.rtr_prefix_len <= ip_bkt_info[level].bi_pfx_len)) {
fin = 1 << (ip_bkt_info[level].bi_pfx_len - rt->rtr_req.rtr_prefix_len);
index &= ~(fin - 1);
} else {
fin = ip_bkt_info[level].bi_size;
index = 0;
}

fin += index;
Expand All @@ -510,15 +512,18 @@ __mtrie_delete(struct vr_route_req *rt, struct ip_bucket_entry *ent,

for (i = index; i < fin; i++) {
tmp_ent = index_to_entry(bkt, i);
if (ENTRY_IS_NEXTHOP(tmp_ent) &&
(tmp_ent->entry_prefix_len == rt->rtr_req.rtr_prefix_len)) {
set_entry_to_nh(tmp_ent, rt->rtr_nh);
if (tmp_ent->entry_prefix_len == rt->rtr_req.rtr_prefix_len) {
tmp_ent->entry_label_flags = rt->rtr_req.rtr_label_flags;
tmp_ent->entry_label = rt->rtr_req.rtr_label;
tmp_ent->entry_prefix_len = rt->rtr_req.rtr_replace_plen;
tmp_ent->entry_bridge_index = rt->rtr_req.rtr_index;
} else
__mtrie_delete(rt, tmp_ent, level + 1);

if (ENTRY_IS_NEXTHOP(tmp_ent)) {
set_entry_to_nh(tmp_ent, rt->rtr_nh);
tmp_ent->entry_bridge_index = rt->rtr_req.rtr_index;
} else {
__mtrie_delete(rt, tmp_ent, level + 1);
}
}
}
}

Expand Down

0 comments on commit 89ed949

Please sign in to comment.