fib_table_entry_special_remove(path->recursive.fp_tbl_id,
fib_entry_get_prefix(path->fp_via_fib),
FIB_SOURCE_RR);
+ fib_table_unlock(path->recursive.fp_tbl_id,
+ dpo_proto_to_fib(path->fp_nh_proto),
+ FIB_SOURCE_RR);
path->fp_via_fib = FIB_NODE_INDEX_INVALID;
}
break;
adj_unlock(path->fp_dpo.dpoi_index);
break;
case FIB_PATH_TYPE_UDP_ENCAP:
- udp_encap_unlock_w_index(path->fp_dpo.dpoi_index);
+ udp_encap_unlock(path->fp_dpo.dpoi_index);
break;
case FIB_PATH_TYPE_EXCLUSIVE:
dpo_reset(&path->exclusive.fp_ex_dpo);
path->fp_type = FIB_PATH_TYPE_DVR;
path->dvr.fp_interface = rpath->frp_sw_if_index;
}
+ else if (rpath->frp_flags & FIB_ROUTE_PATH_EXCLUSIVE)
+ {
+ path->fp_type = FIB_PATH_TYPE_EXCLUSIVE;
+ dpo_copy(&path->exclusive.fp_ex_dpo, &rpath->dpo);
+ }
else if (~0 != rpath->frp_sw_if_index)
{
if (ip46_address_is_zero(&rpath->frp_addr))
case FIB_PATH_TYPE_DVR:
res = (path1->dvr.fp_interface - path2->dvr.fp_interface);
break;
+ case FIB_PATH_TYPE_EXCLUSIVE:
+ res = dpo_cmp(&path1->exclusive.fp_ex_dpo, &path2->exclusive.fp_ex_dpo);
+ break;
case FIB_PATH_TYPE_SPECIAL:
case FIB_PATH_TYPE_RECEIVE:
- case FIB_PATH_TYPE_EXCLUSIVE:
res = 0;
break;
}
case FIB_PATH_TYPE_DVR:
res = (path->dvr.fp_interface - rpath->frp_sw_if_index);
break;
+ case FIB_PATH_TYPE_EXCLUSIVE:
+ res = dpo_cmp(&path->exclusive.fp_ex_dpo, &rpath->dpo);
+ break;
case FIB_PATH_TYPE_SPECIAL:
case FIB_PATH_TYPE_RECEIVE:
- case FIB_PATH_TYPE_EXCLUSIVE:
res = 0;
break;
}
fib_prefix_from_ip46_addr(&path->recursive.fp_nh.fp_ip, &pfx);
}
+ fib_table_lock(path->recursive.fp_tbl_id,
+ dpo_proto_to_fib(path->fp_nh_proto),
+ FIB_SOURCE_RR);
fei = fib_table_entry_special_add(path->recursive.fp_tbl_id,
&pfx,
FIB_SOURCE_RR,