X-Git-Url: https://gerrit.fd.io/r/gitweb?a=blobdiff_plain;f=vpp%2Fapi%2Fapi.c;h=40cfa27bb11d25d6c8f71f5711cd49ab53e985a5;hb=00bbf276be22fa0458366d4dd3f4daf4e55d13e7;hp=7bbb5c030cd3f3ae76b89eefc21097392847e2b2;hpb=d2dc3df90d20419dfaee03f3096ed18d20fa391a;p=vpp.git diff --git a/vpp/api/api.c b/vpp/api/api.c index 7bbb5c030cd..40cfa27bb11 100644 --- a/vpp/api/api.c +++ b/vpp/api/api.c @@ -52,7 +52,9 @@ #include #include #include +#if IPV6SR > 0 #include +#endif #include #include #include @@ -67,13 +69,16 @@ #include #include #include +#include #undef BIHASH_TYPE #undef __included_bihash_template_h__ #include -#if DPDK > 0 +#if IPSEC > 0 #include +#endif /* IPSEC */ +#if DPDK > 0 #include #endif @@ -271,6 +276,7 @@ _(L2TPV3_INTERFACE_ENABLE_DISABLE, l2tpv3_interface_enable_disable) \ _(L2TPV3_SET_LOOKUP_KEY, l2tpv3_set_lookup_key) \ _(SW_IF_L2TPV3_TUNNEL_DUMP, sw_if_l2tpv3_tunnel_dump) \ _(VXLAN_ADD_DEL_TUNNEL, vxlan_add_del_tunnel) \ +_(VXLAN_TUNNEL_DUMP, vxlan_tunnel_dump) \ _(L2_FIB_CLEAR_TABLE, l2_fib_clear_table) \ _(L2_INTERFACE_EFP_FILTER, l2_interface_efp_filter) \ _(L2_INTERFACE_VLAN_TAG_REWRITE, l2_interface_vlan_tag_rewrite) \ @@ -302,7 +308,11 @@ _(MAP_DEL_DOMAIN, map_del_domain) \ _(MAP_ADD_DEL_RULE, map_add_del_rule) \ _(MAP_DOMAIN_DUMP, map_domain_dump) \ _(MAP_RULE_DUMP, map_rule_dump) \ -_(MAP_SUMMARY_STATS, map_summary_stats) +_(MAP_SUMMARY_STATS, map_summary_stats) \ +_(COP_INTERFACE_ENABLE_DISABLE, cop_interface_enable_disable) \ +_(COP_WHITELIST_ENABLE_DISABLE, cop_whitelist_enable_disable) \ +_(GET_NODE_GRAPH, get_node_graph) \ +_(SW_INTERFACE_CLEAR_STATS, sw_interface_clear_stats) #define QUOTE_(x) #x #define QUOTE(x) QUOTE_(x) @@ -1790,6 +1800,7 @@ vl_api_create_vlan_subif_t_handler (vl_api_create_vlan_subif_t * mp) kp = clib_mem_alloc (sizeof (*kp)); *kp = sup_and_sub_key; + memset (&template, 0, sizeof (template)); template.type = VNET_SW_INTERFACE_TYPE_SUB; template.sup_sw_if_index = hi->sw_if_index; template.sub.id = id; @@ -2341,6 +2352,64 @@ static void vl_api_sw_interface_set_flags_t_handler ( REPLY_MACRO(VL_API_SW_INTERFACE_SET_FLAGS_REPLY); } +static void vl_api_sw_interface_clear_stats_t_handler ( + vl_api_sw_interface_clear_stats_t * mp) +{ + vl_api_sw_interface_clear_stats_reply_t *rmp; + + vnet_main_t * vnm = vnet_get_main(); + vnet_interface_main_t * im = &vnm->interface_main; + vlib_simple_counter_main_t * sm; + vlib_combined_counter_main_t * cm; + static vnet_main_t ** my_vnet_mains; + int i, j, n_counters; + + int rv = 0; + + vec_reset_length (my_vnet_mains); + + for (i = 0; i < vec_len (vnet_mains); i++) + { + if (vnet_mains[i]) + vec_add1 (my_vnet_mains, vnet_mains[i]); + } + + if (vec_len (vnet_mains) == 0) + vec_add1 (my_vnet_mains, vnm); + + n_counters = vec_len (im->combined_sw_if_counters); + + for (j = 0; j < n_counters; j++) + { + for (i = 0; i < vec_len(my_vnet_mains); i++) + { + im = &my_vnet_mains[i]->interface_main; + cm = im->combined_sw_if_counters + j; + if (mp->sw_if_index == (u32)~0) + vlib_clear_combined_counters (cm); + else + vlib_zero_combined_counter (cm, ntohl(mp->sw_if_index)); + } + } + + n_counters = vec_len (im->sw_if_counters); + + for (j = 0; j < n_counters; j++) + { + for (i = 0; i < vec_len(my_vnet_mains); i++) + { + im = &my_vnet_mains[i]->interface_main; + sm = im->sw_if_counters + j; + if (mp->sw_if_index == (u32)~0) + vlib_clear_simple_counters (sm); + else + vlib_zero_simple_counter (sm, ntohl(mp->sw_if_index)); + } + } + + REPLY_MACRO(VL_API_SW_INTERFACE_CLEAR_STATS_REPLY); +} + static void send_sw_interface_details (vpe_api_main_t * am, unix_shared_memory_queue_t *q, vnet_sw_interface_t * swif, @@ -2364,6 +2433,7 @@ static void send_sw_interface_details (vpe_api_main_t * am, VNET_HW_INTERFACE_FLAG_DUPLEX_SHIFT); mp->link_speed = ((hi->flags & VNET_HW_INTERFACE_FLAG_SPEED_MASK) >> VNET_HW_INTERFACE_FLAG_SPEED_SHIFT); + mp->link_mtu = ntohs(hi->max_packet_bytes); strncpy ((char *) mp->interface_name, (char *) interface_name, ARRAY_LEN(mp->interface_name)-1); @@ -3275,6 +3345,9 @@ static void vl_api_set_arp_neighbor_limit_t_handler (vl_api_set_arp_neighbor_lim static void vl_api_sr_tunnel_add_del_t_handler (vl_api_sr_tunnel_add_del_t *mp) { +#if IPV6SR == 0 + clib_warning ("unimplemented"); +#else ip6_sr_add_del_tunnel_args_t _a, *a=&_a; int rv = 0; vl_api_sr_tunnel_add_del_reply_t * rmp; @@ -3318,6 +3391,7 @@ static void vl_api_sr_tunnel_add_del_t_handler out: REPLY_MACRO(VL_API_SR_TUNNEL_ADD_DEL_REPLY); +#endif } #define foreach_classify_add_del_table_field \ @@ -3537,7 +3611,8 @@ vl_api_create_vhost_user_if_t_handler (vl_api_create_vhost_user_if_t *mp) rv = dpdk_vhost_user_create_if(vnm, vm, (char *)mp->sock_filename, mp->is_server, &sw_if_index, (u64)~0, - mp->renumber, ntohl(mp->custom_dev_instance)); + mp->renumber, ntohl(mp->custom_dev_instance), + (mp->use_custom_mac)?mp->mac_address:NULL); REPLY_MACRO2(VL_API_CREATE_VHOST_USER_IF_REPLY, ({ @@ -4118,6 +4193,55 @@ out: })); } +static void send_vxlan_tunnel_details +(vxlan_tunnel_t * t, unix_shared_memory_queue_t * q) +{ + vl_api_vxlan_tunnel_details_t * rmp; + ip4_main_t * im = &ip4_main; + + rmp = vl_msg_api_alloc (sizeof (*rmp)); + memset (rmp, 0, sizeof (*rmp)); + rmp->_vl_msg_id = ntohs(VL_API_VXLAN_TUNNEL_DETAILS); + rmp->src_address = t->src.data_u32; + rmp->dst_address = t->dst.data_u32; + rmp->encap_vrf_id = htonl(im->fibs[t->encap_fib_index].table_id); + rmp->vni = htonl(t->vni); + rmp->decap_next_index = htonl(t->decap_next_index); + rmp->sw_if_index = htonl(t->sw_if_index); + + vl_msg_api_send_shmem (q, (u8 *)&rmp); +} + +static void vl_api_vxlan_tunnel_dump_t_handler +(vl_api_vxlan_tunnel_dump_t * mp) +{ + unix_shared_memory_queue_t * q; + vxlan_main_t * vxm = &vxlan_main; + vxlan_tunnel_t * t; + u32 sw_if_index; + + q = vl_api_client_index_to_input_queue (mp->client_index); + if (q == 0) { + return; + } + + sw_if_index = ntohl(mp->sw_if_index); + + if (~0 == sw_if_index) { + pool_foreach (t, vxm->tunnels, + ({ + send_vxlan_tunnel_details(t, q); + })); + } else { + if ((sw_if_index >= vec_len(vxm->tunnel_index_by_sw_if_index)) || + (~0 == vxm->tunnel_index_by_sw_if_index[sw_if_index])) { + return; + } + t = &vxm->tunnels[vxm->tunnel_index_by_sw_if_index[sw_if_index]]; + send_vxlan_tunnel_details(t, q); + } +} + static void vl_api_l2_patch_add_del_t_handler (vl_api_l2_patch_add_del_t *mp) { @@ -4459,6 +4583,10 @@ static void vl_api_input_acl_set_interface_t_handler static void vl_api_ipsec_spd_add_del_t_handler (vl_api_ipsec_spd_add_del_t * mp) { +#if IPSEC == 0 + clib_warning ("unimplemented"); +#else + vlib_main_t *vm __attribute__((unused)) = vlib_get_main(); vl_api_ipsec_spd_add_del_reply_t * rmp; int rv; @@ -4470,6 +4598,7 @@ static void vl_api_ipsec_spd_add_del_t_handler #endif REPLY_MACRO(VL_API_IPSEC_SPD_ADD_DEL_REPLY); +#endif } static void vl_api_ipsec_interface_add_del_spd_t_handler @@ -4486,7 +4615,7 @@ static void vl_api_ipsec_interface_add_del_spd_t_handler VALIDATE_SW_IF_INDEX(mp); -#if DPDK > 0 +#if IPSEC > 0 rv = ipsec_set_interface_spd(vm, sw_if_index, spd_id, mp->is_add); #else rv = VNET_API_ERROR_UNIMPLEMENTED; @@ -4504,7 +4633,7 @@ static void vl_api_ipsec_spd_add_del_entry_t_handler vl_api_ipsec_spd_add_del_entry_reply_t * rmp; int rv; -#if DPDK > 0 +#if IPSEC > 0 ipsec_policy_t p; p.id = ntohl(mp->spd_id); @@ -4554,7 +4683,7 @@ static void vl_api_ipsec_sad_add_del_entry_t_handler vlib_main_t *vm __attribute__((unused)) = vlib_get_main(); vl_api_ipsec_sad_add_del_entry_reply_t * rmp; int rv; -#if DPDK > 0 +#if IPSEC > 0 ipsec_sa_t sa; sa.id = ntohl(mp->sad_id); @@ -4780,7 +4909,7 @@ static void vl_api_ipsec_sa_set_key_t_handler vlib_main_t *vm __attribute__((unused)) = vlib_get_main(); vl_api_ipsec_sa_set_key_reply_t *rmp; int rv; -#if DPDK > 0 +#if IPSEC > 0 ipsec_sa_t sa; sa.id = ntohl(mp->sa_id); sa.crypto_key_len = mp->crypto_key_length; @@ -4796,6 +4925,78 @@ static void vl_api_ipsec_sa_set_key_t_handler REPLY_MACRO(VL_API_IPSEC_SA_SET_KEY_REPLY); } +static void vl_api_cop_interface_enable_disable_t_handler +(vl_api_cop_interface_enable_disable_t * mp) +{ + vl_api_cop_interface_enable_disable_reply_t * rmp; + int rv; + u32 sw_if_index = ntohl(mp->sw_if_index); + int enable_disable; + + VALIDATE_SW_IF_INDEX(mp); + + enable_disable = (int) mp->enable_disable; + + rv = cop_interface_enable_disable (sw_if_index, enable_disable); + + BAD_SW_IF_INDEX_LABEL; + + REPLY_MACRO(VL_API_COP_INTERFACE_ENABLE_DISABLE_REPLY); +} + +static void vl_api_cop_whitelist_enable_disable_t_handler +(vl_api_cop_whitelist_enable_disable_t * mp) +{ + vl_api_cop_whitelist_enable_disable_reply_t * rmp; + cop_whitelist_enable_disable_args_t _a, *a=&_a; + u32 sw_if_index = ntohl(mp->sw_if_index); + int rv; + + VALIDATE_SW_IF_INDEX(mp); + + a->sw_if_index = sw_if_index; + a->ip4 = mp->ip4; + a->ip6 = mp->ip6; + a->default_cop = mp->default_cop; + a->fib_id = ntohl(mp->fib_id); + + rv = cop_whitelist_enable_disable (a); + + BAD_SW_IF_INDEX_LABEL; + + REPLY_MACRO(VL_API_COP_WHITELIST_ENABLE_DISABLE_REPLY); +} + +static void vl_api_get_node_graph_t_handler +(vl_api_get_node_graph_t * mp) +{ + int rv = 0; + u8 * vector = 0; + api_main_t * am = &api_main; + vlib_main_t * vm = vlib_get_main(); + void * oldheap; + vl_api_get_node_graph_reply_t * rmp; + + pthread_mutex_lock (&am->vlib_rp->mutex); + oldheap = svm_push_data_heap (am->vlib_rp); + + /* + * Keep the number of memcpy ops to a minimum (e.g. 1). + * The current size of the serialized vector is + * slightly under 4K. + */ + vec_validate (vector, 4095); + vec_reset_length (vector); + + vector = vlib_node_serialize (&vm->node_main, vector); + + svm_pop_heap (oldheap); + pthread_mutex_unlock (&am->vlib_rp->mutex); + + REPLY_MACRO2(VL_API_GET_NODE_GRAPH_REPLY, + rmp->reply_in_shmem = (uword) vector); +} + #define BOUNCE_HANDLER(nn) \ static void vl_api_##nn##_t_handler ( \ vl_api_##nn##_t *mp) \ @@ -4916,6 +5117,26 @@ vpe_api_init (vlib_main_t *vm) VLIB_INIT_FUNCTION(vpe_api_init); +static clib_error_t * +chroot_config (vlib_main_t * vm, unformat_input_t * input) +{ + u8 * chroot_path; + + while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT) + { + if (unformat (input, "prefix %s", &chroot_path)) + { + vec_add1 (chroot_path, 0); + vl_set_memory_root_path ((char *)chroot_path); + } + else + return clib_error_return (0, "unknown input `%U'", + format_unformat_error, input); + } + return 0; +} +VLIB_EARLY_CONFIG_FUNCTION (chroot_config, "chroot"); + void * get_unformat_vnet_sw_interface (void) { return (void *) &unformat_vnet_sw_interface;