+ rv = fib_api_route_add_del (mp->is_add, mp->is_multipath, fib_index, &pfx,
+ FIB_SOURCE_API, entry_flags, rpaths);
+
+ if (mp->is_add && 0 == rv)
+ *stats_index = fib_table_entry_get_stats_index (fib_index, &pfx);
+
+out:
+ vec_free (rpaths);
+
+ return (rv);
+}
+
+static int
+ip_route_add_del_v2_t_handler (vl_api_ip_route_add_del_v2_t *mp,
+ u32 *stats_index)
+{
+ fib_route_path_t *rpaths = NULL, *rpath;
+ fib_entry_flag_t entry_flags;
+ vl_api_fib_path_t *apath;
+ fib_source_t src;
+ fib_prefix_t pfx;
+ u32 fib_index;
+ int rv, ii;
+
+ entry_flags = FIB_ENTRY_FLAG_NONE;
+ ip_prefix_decode (&mp->route.prefix, &pfx);
+
+ rv = fib_api_table_id_decode (pfx.fp_proto, ntohl (mp->route.table_id),
+ &fib_index);
+ if (0 != rv)
+ goto out;
+
+ if (0 != mp->route.n_paths)
+ vec_validate (rpaths, mp->route.n_paths - 1);
+
+ for (ii = 0; ii < mp->route.n_paths; ii++)
+ {
+ apath = &mp->route.paths[ii];
+ rpath = &rpaths[ii];
+
+ rv = fib_api_path_decode (apath, rpath);
+
+ if ((rpath->frp_flags & FIB_ROUTE_PATH_LOCAL) &&
+ (~0 == rpath->frp_sw_if_index))
+ entry_flags |= (FIB_ENTRY_FLAG_CONNECTED | FIB_ENTRY_FLAG_LOCAL);
+
+ if (0 != rv)
+ goto out;
+ }
+
+ src = (0 == mp->route.src ? FIB_SOURCE_API : mp->route.src);
+
+ rv = fib_api_route_add_del (mp->is_add, mp->is_multipath, fib_index, &pfx,
+ src, entry_flags, rpaths);