X-Git-Url: https://gerrit.fd.io/r/gitweb?a=blobdiff_plain;f=vpp%2Fapi%2Fapi.c;h=9a5935a880c796439d02ad270cbb0514633a8383;hb=8ebb2a1632ccf2079cd6217af2d4045021dc3b9e;hp=75e98fb2c26e6600f832468ce856019514c39da8;hpb=c71c426f6903e39590d769a65a5379319ead7edf;p=vpp.git diff --git a/vpp/api/api.c b/vpp/api/api.c index 75e98fb2c26..9a5935a880c 100644 --- a/vpp/api/api.c +++ b/vpp/api/api.c @@ -340,6 +340,9 @@ _(LISP_GPE_TUNNEL_DUMP, lisp_gpe_tunnel_dump) \ _(LISP_MAP_RESOLVER_DUMP, lisp_map_resolver_dump) \ _(LISP_ENABLE_DISABLE_STATUS_DUMP, \ lisp_enable_disable_status_dump) \ +_(LISP_ADD_DEL_MAP_REQUEST_ITR_RLOCS, \ + lisp_add_del_map_request_itr_rlocs) \ +_(LISP_GET_MAP_REQUEST_ITR_RLOCS, lisp_get_map_request_itr_rlocs) \ _(SR_MULTICAST_MAP_ADD_DEL, sr_multicast_map_add_del) \ _(AF_PACKET_CREATE, af_packet_create) \ _(AF_PACKET_DELETE, af_packet_delete) \ @@ -974,7 +977,18 @@ static int ip4_add_del_route_t_handler (vl_api_ip_add_del_route_t *mp) } nh_adj = ip_get_adjacency (lm, ai); - vec_add1 (add_adj, nh_adj[0]); + if (nh_adj->lookup_next_index == IP_LOOKUP_NEXT_ARP && + nh_adj->arp.next_hop.ip4.as_u32 == 0) { + /* the next-hop resovles via a glean adj. create and use + * a ARP adj for the next-hop */ + a.adj_index = vnet_arp_glean_add(fib_index, &next_hop_address); + a.add_adj = NULL; + a.n_add_adj = 0; + ip4_add_del_route (im, &a); + + goto done; + } + vec_add1 (add_adj, nh_adj[0]); if (mp->lookup_in_vrf) { p = hash_get (im->fib_index_by_table_id, ntohl(mp->lookup_in_vrf)); if (p) @@ -1016,6 +1030,7 @@ do_add_del: vec_free (add_adj); +done: dsunlock (sm); return 0; } @@ -1330,6 +1345,8 @@ static void vl_api_sw_interface_set_vpath_t_handler (vl_api_sw_interface_set_vpath_t *mp) { vlib_main_t *vm = vlib_get_main(); + ip4_main_t * im4 = &ip4_main; + ip6_main_t * im6 = &ip6_main; vl_api_sw_interface_set_vpath_reply_t * rmp; int rv = 0; u32 ci; @@ -1349,36 +1366,52 @@ vl_api_sw_interface_set_vpath_t_handler (vl_api_sw_interface_set_vpath_t *mp) if (mp->enable) { ci = rx_cm4u->config_index_by_sw_if_index[sw_if_index]; //IP4 unicast ci = vnet_config_add_feature(vm, &rx_cm4u->config_main, - ci, IP4_RX_FEATURE_VPATH, 0, 0); + ci, + im4->ip4_unicast_rx_feature_vpath, + 0, 0); rx_cm4u->config_index_by_sw_if_index[sw_if_index] = ci; ci = rx_cm4m->config_index_by_sw_if_index[sw_if_index]; //IP4 mcast ci = vnet_config_add_feature(vm, &rx_cm4m->config_main, - ci, IP4_RX_FEATURE_VPATH, 0, 0); + ci, + im4->ip4_multicast_rx_feature_vpath, + 0, 0); rx_cm4m->config_index_by_sw_if_index[sw_if_index] = ci; ci = rx_cm6u->config_index_by_sw_if_index[sw_if_index]; //IP6 unicast ci = vnet_config_add_feature(vm, &rx_cm6u->config_main, - ci, IP6_RX_FEATURE_VPATH, 0, 0); + ci, + im6->ip6_unicast_rx_feature_vpath, + 0, 0); rx_cm6u->config_index_by_sw_if_index[sw_if_index] = ci; ci = rx_cm6m->config_index_by_sw_if_index[sw_if_index]; //IP6 mcast ci = vnet_config_add_feature(vm, &rx_cm6m->config_main, - ci, IP6_RX_FEATURE_VPATH, 0, 0); + ci, + im6->ip6_multicast_rx_feature_vpath, + 0, 0); rx_cm6m->config_index_by_sw_if_index[sw_if_index] = ci; } else { ci = rx_cm4u->config_index_by_sw_if_index[sw_if_index]; //IP4 unicast ci = vnet_config_del_feature(vm, &rx_cm4u->config_main, - ci, IP4_RX_FEATURE_VPATH, 0, 0); + ci, + im4->ip4_unicast_rx_feature_vpath, + 0, 0); rx_cm4u->config_index_by_sw_if_index[sw_if_index] = ci; ci = rx_cm4m->config_index_by_sw_if_index[sw_if_index]; //IP4 mcast ci = vnet_config_del_feature(vm, &rx_cm4m->config_main, - ci, IP4_RX_FEATURE_VPATH, 0, 0); + ci, + im4->ip4_multicast_rx_feature_vpath, + 0, 0); rx_cm4m->config_index_by_sw_if_index[sw_if_index] = ci; ci = rx_cm6u->config_index_by_sw_if_index[sw_if_index]; //IP6 unicast ci = vnet_config_del_feature(vm, &rx_cm6u->config_main, - ci, IP6_RX_FEATURE_VPATH, 0, 0); + ci, + im6->ip6_unicast_rx_feature_vpath, + 0, 0); rx_cm6u->config_index_by_sw_if_index[sw_if_index] = ci; ci = rx_cm6m->config_index_by_sw_if_index[sw_if_index]; //IP6 mcast ci = vnet_config_del_feature(vm, &rx_cm6m->config_main, - ci, IP6_RX_FEATURE_VPATH, 0, 0); + ci, + im6->ip6_multicast_rx_feature_vpath, + 0, 0); rx_cm6m->config_index_by_sw_if_index[sw_if_index] = ci; } @@ -4557,7 +4590,7 @@ vl_api_vxlan_gpe_add_del_tunnel_t_handler } encap_fib_index = p[0]; - protocol = ntohl(mp->protocol); + protocol = mp->protocol; /* Interpret decap_vrf_id as an opaque if sending to other-than-ip4-input */ if (protocol == VXLAN_GPE_INPUT_NEXT_IP4_INPUT) { @@ -4902,7 +4935,7 @@ vl_api_lisp_gpe_add_del_iface_t_handler( a->is_add = mp->is_add; a->table_id = mp->table_id; a->vni = mp->vni; - vnet_lisp_gpe_add_del_iface (a, 0); + rv = vnet_lisp_gpe_add_del_iface (a, 0); REPLY_MACRO(VL_API_LISP_GPE_ADD_DEL_IFACE_REPLY); } @@ -4922,6 +4955,27 @@ vl_api_lisp_pitr_set_locator_set_t_handler( REPLY_MACRO(VL_API_LISP_PITR_SET_LOCATOR_SET_REPLY); } +static void +vl_api_lisp_add_del_map_request_itr_rlocs_t_handler +(vl_api_lisp_add_del_map_request_itr_rlocs_t *mp) +{ + vl_api_lisp_add_del_map_request_itr_rlocs_reply_t *rmp; + int rv = 0; + u8 * locator_set_name = NULL; + vnet_lisp_add_del_mreq_itr_rloc_args_t _a, * a = &_a; + + locator_set_name = format (0, "%s", mp->locator_set_name); + + a->is_add = mp->is_add; + a->locator_set_name = locator_set_name; + + rv = vnet_lisp_add_del_mreq_itr_rlocs(a); + + vec_free(locator_set_name); + + REPLY_MACRO(VL_API_LISP_ADD_DEL_MAP_REQUEST_ITR_RLOCS_REPLY); +} + /** Used for transferring locators via VPP API */ typedef CLIB_PACKED(struct { @@ -5228,7 +5282,7 @@ send_lisp_map_resolver_details (ip_address_t *ip, static void vl_api_lisp_map_resolver_dump_t_handler ( - vl_api_lisp_local_eid_table_dump_t *mp) + vl_api_lisp_map_resolver_dump_t *mp) { unix_shared_memory_queue_t * q = NULL; lisp_cp_main_t * lcm = vnet_lisp_cp_get_main(); @@ -5276,6 +5330,38 @@ vl_api_lisp_enable_disable_status_dump_t_handler send_lisp_enable_disable_details(q, mp->context); } +static void +vl_api_lisp_get_map_request_itr_rlocs_t_handler ( + vl_api_lisp_get_map_request_itr_rlocs_t *mp) +{ + unix_shared_memory_queue_t * q = NULL; + vl_api_lisp_get_map_request_itr_rlocs_reply_t *rmp = NULL; + lisp_cp_main_t * lcm = vnet_lisp_cp_get_main(); + locator_set_t * loc_set = 0; + u8 * tmp_str = 0; + int rv = 0; + + q = vl_api_client_index_to_input_queue (mp->client_index); + if (q == 0) { + return; + } + + if (~0 == lcm->mreq_itr_rlocs) { + tmp_str = format(0, " "); + } else { + loc_set = pool_elt_at_index (lcm->locator_set_pool, lcm->mreq_itr_rlocs); + tmp_str = format(0, "%s", loc_set->name); + } + + REPLY_MACRO2(VL_API_LISP_GET_MAP_REQUEST_ITR_RLOCS_REPLY, + ({ + strncpy((char *) rmp->locator_set_name, (char *) tmp_str, + ARRAY_LEN(rmp->locator_set_name) - 1); + })); + + vec_free(tmp_str); +} + static void vl_api_interface_name_renumber_t_handler (vl_api_interface_name_renumber_t *mp) { @@ -6001,16 +6087,18 @@ vl_api_af_packet_create_t_handler vl_api_af_packet_create_reply_t *rmp; int rv = 0; u8 *host_if_name = NULL; + u32 sw_if_index; host_if_name = format(0, "%s", mp->host_if_name); vec_add1 (host_if_name, 0); rv = af_packet_create_if(vm, host_if_name, - mp->use_random_hw_addr ? 0 : mp->hw_addr, 0); + mp->use_random_hw_addr ? 0 : mp->hw_addr, &sw_if_index); vec_free(host_if_name); - REPLY_MACRO(VL_API_AF_PACKET_CREATE_REPLY); + REPLY_MACRO2(VL_API_AF_PACKET_CREATE_REPLY, + rmp->sw_if_index = clib_host_to_net_u32(sw_if_index)); } static void