X-Git-Url: https://gerrit.fd.io/r/gitweb?a=blobdiff_plain;f=src%2Fvnet%2Fip%2Fip_api.c;h=b976eaeaa6b62b204e1c2cbb5d1d46fd31b524f6;hb=f5d38e05a;hp=d5fa2d32f21819065d27bec78b34525997cbfdb4;hpb=2fdb41ae41bd3a034bf28d06c17df992fc664d37;p=vpp.git diff --git a/src/vnet/ip/ip_api.c b/src/vnet/ip/ip_api.c index d5fa2d32f21..b976eaeaa6b 100644 --- a/src/vnet/ip/ip_api.c +++ b/src/vnet/ip/ip_api.c @@ -82,6 +82,7 @@ _(IP_TABLE_REPLACE_BEGIN, ip_table_replace_begin) \ _(IP_TABLE_REPLACE_END, ip_table_replace_end) \ _(IP_TABLE_FLUSH, ip_table_flush) \ _(IP_ROUTE_ADD_DEL, ip_route_add_del) \ +_(IP_ROUTE_LOOKUP, ip_route_lookup) \ _(IP_TABLE_ADD_DEL, ip_table_add_del) \ _(IP_PUNT_POLICE, ip_punt_police) \ _(IP_PUNT_REDIRECT, ip_punt_redirect) \ @@ -573,6 +574,62 @@ vl_api_ip_route_add_del_t_handler (vl_api_ip_route_add_del_t * mp) /* *INDENT-ON* */ } +void +vl_api_ip_route_lookup_t_handler (vl_api_ip_route_lookup_t * mp) +{ + vl_api_ip_route_lookup_reply_t *rmp = NULL; + fib_route_path_t *rpaths = NULL, *rpath; + const fib_prefix_t *pfx = NULL; + fib_prefix_t lookup; + vl_api_fib_path_t *fp; + fib_node_index_t fib_entry_index; + u32 fib_index; + int npaths = 0; + int rv; + + ip_prefix_decode (&mp->prefix, &lookup); + rv = fib_api_table_id_decode (lookup.fp_proto, ntohl (mp->table_id), + &fib_index); + if (PREDICT_TRUE (!rv)) + { + if (mp->exact) + fib_entry_index = fib_table_lookup_exact_match (fib_index, &lookup); + else + fib_entry_index = fib_table_lookup (fib_index, &lookup); + if (fib_entry_index == FIB_NODE_INDEX_INVALID) + rv = VNET_API_ERROR_NO_SUCH_ENTRY; + else + { + pfx = fib_entry_get_prefix (fib_entry_index); + rpaths = fib_entry_encode (fib_entry_index); + npaths = vec_len (rpaths); + } + } + + /* *INDENT-OFF* */ + REPLY_MACRO3_ZERO(VL_API_IP_ROUTE_LOOKUP_REPLY, + npaths * sizeof (*fp), + ({ + if (!rv) + { + ip_prefix_encode (pfx, &rmp->route.prefix); + rmp->route.table_id = mp->table_id; + rmp->route.n_paths = npaths; + rmp->route.stats_index = fib_table_entry_get_stats_index (fib_index, pfx); + rmp->route.stats_index = htonl (rmp->route.stats_index); + + fp = rmp->route.paths; + vec_foreach (rpath, rpaths) + { + fib_api_path_encode (rpath, fp); + fp++; + } + } + })); + /* *INDENT-ON* */ + vec_free (rpaths); +} + void ip_table_create (fib_protocol_t fproto, u32 table_id, u8 is_api, const u8 * name)