- return;
- }
-
- q = vl_api_client_index_to_input_queue (mp->client_index);
- if (q == 0)
- {
- return;
- }
-
- for (i = 0; i < (0x1 << d->psid_length); i++)
- {
- dst = d->rules[i];
- if (dst.as_u64[0] == 0 && dst.as_u64[1] == 0)
- {
- continue;
- }
- rmp = vl_msg_api_alloc (sizeof (*rmp));
- memset (rmp, 0, sizeof (*rmp));
- rmp->_vl_msg_id = ntohs (VL_API_MAP_RULE_DETAILS);
- rmp->psid = htons (i);
- clib_memcpy (rmp->ip6_dst, &dst, sizeof (rmp->ip6_dst));
- rmp->context = mp->context;
- vl_msg_api_send_shmem (q, (u8 *) & rmp);
- }
-}
-
-static void
-vl_api_map_summary_stats_t_handler (vl_api_map_summary_stats_t * mp)
-{
- vl_api_map_summary_stats_reply_t *rmp;
- vlib_combined_counter_main_t *cm;
- vlib_counter_t v;
- int i, which;
- u64 total_pkts[VLIB_N_RX_TX];
- u64 total_bytes[VLIB_N_RX_TX];
- map_main_t *mm = &map_main;
- unix_shared_memory_queue_t *q =
- vl_api_client_index_to_input_queue (mp->client_index);
-
- if (!q)
- return;
-
- rmp = vl_msg_api_alloc (sizeof (*rmp));
- rmp->_vl_msg_id = ntohs (VL_API_MAP_SUMMARY_STATS_REPLY);
- rmp->context = mp->context;
- rmp->retval = 0;
-
- memset (total_pkts, 0, sizeof (total_pkts));
- memset (total_bytes, 0, sizeof (total_bytes));
-
- map_domain_counter_lock (mm);
- vec_foreach (cm, mm->domain_counters)
- {
- which = cm - mm->domain_counters;
-
- for (i = 0; i < vec_len (cm->maxi); i++)
- {
- vlib_get_combined_counter (cm, i, &v);
- total_pkts[which] += v.packets;
- total_bytes[which] += v.bytes;
- }
- }
-
- map_domain_counter_unlock (mm);
-
- /* Note: in network byte order! */
- rmp->total_pkts[MAP_DOMAIN_COUNTER_RX] =
- clib_host_to_net_u64 (total_pkts[MAP_DOMAIN_COUNTER_RX]);
- rmp->total_bytes[MAP_DOMAIN_COUNTER_RX] =
- clib_host_to_net_u64 (total_bytes[MAP_DOMAIN_COUNTER_RX]);
- rmp->total_pkts[MAP_DOMAIN_COUNTER_TX] =
- clib_host_to_net_u64 (total_pkts[MAP_DOMAIN_COUNTER_TX]);
- rmp->total_bytes[MAP_DOMAIN_COUNTER_TX] =
- clib_host_to_net_u64 (total_bytes[MAP_DOMAIN_COUNTER_TX]);
- rmp->total_bindings = clib_host_to_net_u64 (pool_elts (mm->domains));
- rmp->total_ip4_fragments = 0; // Not yet implemented. Should be a simple counter.
- rmp->total_security_check[MAP_DOMAIN_COUNTER_TX] =
- clib_host_to_net_u64 (map_error_counter_get
- (ip4_map_node.index, MAP_ERROR_ENCAP_SEC_CHECK));
- rmp->total_security_check[MAP_DOMAIN_COUNTER_RX] =
- clib_host_to_net_u64 (map_error_counter_get
- (ip4_map_node.index, MAP_ERROR_DECAP_SEC_CHECK));
-
- vl_msg_api_send_shmem (q, (u8 *) & rmp);
-}
-
-static void
-vl_api_ipsec_sa_set_key_t_handler (vl_api_ipsec_sa_set_key_t * mp)
-{
- vlib_main_t *vm __attribute__ ((unused)) = vlib_get_main ();
- vl_api_ipsec_sa_set_key_reply_t *rmp;
- int rv;
-#if IPSEC > 0
- ipsec_sa_t sa;
- sa.id = ntohl (mp->sa_id);
- sa.crypto_key_len = mp->crypto_key_length;
- clib_memcpy (&sa.crypto_key, mp->crypto_key, sizeof (sa.crypto_key));
- sa.integ_key_len = mp->integrity_key_length;
- clib_memcpy (&sa.integ_key, mp->integrity_key, sizeof (sa.integ_key));
-
- rv = ipsec_set_sa_key (vm, &sa);
-#else
- rv = VNET_API_ERROR_UNIMPLEMENTED;
-#endif
-
- 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).
- */
- vec_validate (vector, 16384);
- vec_reset_length (vector);
-
- /* $$$$ FIXME */
- vector = vlib_node_serialize (&vm->node_main, vector,
- (u32) ~ 0 /* all threads */ ,
- 1 /* include nexts */ ,
- 1 /* include stats */ );
-
- svm_pop_heap (oldheap);
- pthread_mutex_unlock (&am->vlib_rp->mutex);
-
- /* *INDENT-OFF* */
- REPLY_MACRO2(VL_API_GET_NODE_GRAPH_REPLY,
- ({
- rmp->reply_in_shmem = (uword) vector;
- }));
- /* *INDENT-ON* */
-}
-
-static void
-vl_api_ioam_enable_t_handler (vl_api_ioam_enable_t * mp)
-{
- int rv = 0;
- vl_api_ioam_enable_reply_t *rmp;
- clib_error_t *error;
-
- /* Ignoring the profile id as currently a single profile
- * is supported */
- error = ip6_ioam_enable (mp->trace_enable, mp->pot_enable,
- mp->seqno, mp->analyse);
- if (error)
- {
- clib_error_report (error);
- rv = clib_error_get_code (error);
- }
-
- REPLY_MACRO (VL_API_IOAM_ENABLE_REPLY);
-}
-
-static void
-vl_api_ioam_disable_t_handler (vl_api_ioam_disable_t * mp)
-{
- int rv = 0;
- vl_api_ioam_disable_reply_t *rmp;
- clib_error_t *error;
-
- error = clear_ioam_rewrite_fn ();
- if (error)
- {
- clib_error_report (error);
- rv = clib_error_get_code (error);
- }
-
- REPLY_MACRO (VL_API_IOAM_DISABLE_REPLY);
-}
-
-static void
-vl_api_af_packet_create_t_handler (vl_api_af_packet_create_t * mp)
-{
- vlib_main_t *vm = vlib_get_main ();
- 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,
- &sw_if_index);
-
- vec_free (host_if_name);
-
- /* *INDENT-OFF* */
- REPLY_MACRO2(VL_API_AF_PACKET_CREATE_REPLY,
- ({
- rmp->sw_if_index = clib_host_to_net_u32(sw_if_index);
- }));
- /* *INDENT-ON* */
-}
-
-static void
-vl_api_af_packet_delete_t_handler (vl_api_af_packet_delete_t * mp)
-{
- vlib_main_t *vm = vlib_get_main ();
- vl_api_af_packet_delete_reply_t *rmp;
- int rv = 0;
- u8 *host_if_name = NULL;
-
- host_if_name = format (0, "%s", mp->host_if_name);
- vec_add1 (host_if_name, 0);
-
- rv = af_packet_delete_if (vm, host_if_name);
-
- vec_free (host_if_name);
-
- REPLY_MACRO (VL_API_AF_PACKET_DELETE_REPLY);
-}
-
-static void
-vl_api_policer_add_del_t_handler (vl_api_policer_add_del_t * mp)
-{
- vlib_main_t *vm = vlib_get_main ();
- vl_api_policer_add_del_reply_t *rmp;
- int rv = 0;
- u8 *name = NULL;
- sse2_qos_pol_cfg_params_st cfg;
- clib_error_t *error;
- u32 policer_index;
-
- name = format (0, "%s", mp->name);
-
- memset (&cfg, 0, sizeof (cfg));
- cfg.rfc = mp->type;
- cfg.rnd_type = mp->round_type;
- cfg.rate_type = mp->rate_type;
- cfg.rb.kbps.cir_kbps = mp->cir;
- cfg.rb.kbps.eir_kbps = mp->eir;
- cfg.rb.kbps.cb_bytes = mp->cb;
- cfg.rb.kbps.eb_bytes = mp->eb;
- cfg.conform_action.action_type = mp->conform_action_type;
- cfg.conform_action.dscp = mp->conform_dscp;
- cfg.exceed_action.action_type = mp->exceed_action_type;
- cfg.exceed_action.dscp = mp->exceed_dscp;
- cfg.violate_action.action_type = mp->violate_action_type;
- cfg.violate_action.dscp = mp->violate_dscp;
- cfg.color_aware = mp->color_aware;
-
- error = policer_add_del (vm, name, &cfg, &policer_index, mp->is_add);
-
- if (error)
- rv = VNET_API_ERROR_UNSPECIFIED;
-
- /* *INDENT-OFF* */
- REPLY_MACRO2(VL_API_POLICER_ADD_DEL_REPLY,
- ({
- if (rv == 0 && mp->is_add)
- rmp->policer_index = ntohl(policer_index);
- else
- rmp->policer_index = ~0;
- }));
- /* *INDENT-ON* */
-}
-
-static void
-send_policer_details (u8 * name,
- sse2_qos_pol_cfg_params_st * config,
- policer_read_response_type_st * templ,
- unix_shared_memory_queue_t * q, u32 context)
-{
- vl_api_policer_details_t *mp;
-
- mp = vl_msg_api_alloc (sizeof (*mp));
- memset (mp, 0, sizeof (*mp));
- mp->_vl_msg_id = ntohs (VL_API_POLICER_DETAILS);
- mp->context = context;
- mp->cir = htonl (config->rb.kbps.cir_kbps);
- mp->eir = htonl (config->rb.kbps.eir_kbps);
- mp->cb = htonl (config->rb.kbps.cb_bytes);
- mp->eb = htonl (config->rb.kbps.eb_bytes);
- mp->rate_type = config->rate_type;
- mp->round_type = config->rnd_type;
- mp->type = config->rfc;
- mp->conform_action_type = config->conform_action.action_type;
- mp->conform_dscp = config->conform_action.dscp;
- mp->exceed_action_type = config->exceed_action.action_type;
- mp->exceed_dscp = config->exceed_action.dscp;
- mp->violate_action_type = config->violate_action.action_type;
- mp->violate_dscp = config->violate_action.dscp;
- mp->single_rate = templ->single_rate ? 1 : 0;
- mp->color_aware = templ->color_aware ? 1 : 0;
- mp->scale = htonl (templ->scale);
- mp->cir_tokens_per_period = htonl (templ->cir_tokens_per_period);
- mp->pir_tokens_per_period = htonl (templ->pir_tokens_per_period);
- mp->current_limit = htonl (templ->current_limit);
- mp->current_bucket = htonl (templ->current_bucket);
- mp->extended_limit = htonl (templ->extended_limit);
- mp->extended_bucket = htonl (templ->extended_bucket);
- mp->last_update_time = clib_host_to_net_u64 (templ->last_update_time);
-
- strncpy ((char *) mp->name, (char *) name, ARRAY_LEN (mp->name) - 1);
-
- vl_msg_api_send_shmem (q, (u8 *) & mp);
-}
-
-static void
-vl_api_policer_dump_t_handler (vl_api_policer_dump_t * mp)
-{
- unix_shared_memory_queue_t *q;
- vnet_policer_main_t *pm = &vnet_policer_main;
- hash_pair_t *hp;
- uword *p;
- u32 pool_index;
- u8 *match_name = 0;
- u8 *name;
- sse2_qos_pol_cfg_params_st *config;
- policer_read_response_type_st *templ;
-
- q = vl_api_client_index_to_input_queue (mp->client_index);
- if (q == 0)
- return;
-
- if (mp->match_name_valid)
- {
- match_name = format (0, "%s%c", mp->match_name, 0);
- }
-
- if (mp->match_name_valid)
- {
- p = hash_get_mem (pm->policer_config_by_name, match_name);
- if (p)
- {
- pool_index = p[0];
- config = pool_elt_at_index (pm->configs, pool_index);
- templ = pool_elt_at_index (pm->policer_templates, pool_index);
- send_policer_details (match_name, config, templ, q, mp->context);
- }
- }
- else
- {
- /* *INDENT-OFF* */
- hash_foreach_pair (hp, pm->policer_config_by_name,
- ({
- name = (u8 *) hp->key;
- pool_index = hp->value[0];
- config = pool_elt_at_index (pm->configs, pool_index);
- templ = pool_elt_at_index (pm->policer_templates, pool_index);
- send_policer_details(name, config, templ, q, mp->context);
- }));
- /* *INDENT-ON* */
- }
-}
-
-static void
- vl_api_policer_classify_set_interface_t_handler
- (vl_api_policer_classify_set_interface_t * mp)
-{
- vlib_main_t *vm = vlib_get_main ();
- vl_api_policer_classify_set_interface_reply_t *rmp;
- int rv;
- u32 sw_if_index, ip4_table_index, ip6_table_index, l2_table_index;
-
- ip4_table_index = ntohl (mp->ip4_table_index);
- ip6_table_index = ntohl (mp->ip6_table_index);
- l2_table_index = ntohl (mp->l2_table_index);
- sw_if_index = ntohl (mp->sw_if_index);
-
- VALIDATE_SW_IF_INDEX (mp);
-
- rv = vnet_set_policer_classify_intfc (vm, sw_if_index, ip4_table_index,
- ip6_table_index, l2_table_index,
- mp->is_add);
-
- BAD_SW_IF_INDEX_LABEL;
-
- REPLY_MACRO (VL_API_POLICER_CLASSIFY_SET_INTERFACE_REPLY);
-}
-
-static void
-send_policer_classify_details (u32 sw_if_index,
- u32 table_index,
- unix_shared_memory_queue_t * q, u32 context)
-{
- vl_api_policer_classify_details_t *mp;
-
- mp = vl_msg_api_alloc (sizeof (*mp));
- memset (mp, 0, sizeof (*mp));
- mp->_vl_msg_id = ntohs (VL_API_POLICER_CLASSIFY_DETAILS);
- mp->context = context;
- mp->sw_if_index = htonl (sw_if_index);
- mp->table_index = htonl (table_index);
-
- vl_msg_api_send_shmem (q, (u8 *) & mp);
-}
-
-static void
-vl_api_policer_classify_dump_t_handler (vl_api_policer_classify_dump_t * mp)
-{
- unix_shared_memory_queue_t *q;
- policer_classify_main_t *pcm = &policer_classify_main;
- u32 *vec_tbl;
- int i;
-
- q = vl_api_client_index_to_input_queue (mp->client_index);
- if (q == 0)
- return;
-
- vec_tbl = pcm->classify_table_index_by_sw_if_index[mp->type];
-
- if (vec_len (vec_tbl))
- {
- for (i = 0; i < vec_len (vec_tbl); i++)
- {
- if (vec_elt (vec_tbl, i) == ~0)
- continue;
-
- send_policer_classify_details (i, vec_elt (vec_tbl, i), q,
- mp->context);
- }
- }
-}
-
-static void
-vl_api_netmap_create_t_handler (vl_api_netmap_create_t * mp)
-{
- vlib_main_t *vm = vlib_get_main ();
- vl_api_netmap_create_reply_t *rmp;
- int rv = 0;
- u8 *if_name = NULL;
-
- if_name = format (0, "%s", mp->netmap_if_name);
- vec_add1 (if_name, 0);
-
- rv =
- netmap_create_if (vm, if_name, mp->use_random_hw_addr ? 0 : mp->hw_addr,
- mp->is_pipe, mp->is_master, 0);
-
- vec_free (if_name);
-
- REPLY_MACRO (VL_API_NETMAP_CREATE_REPLY);
-}
-
-static void
-vl_api_netmap_delete_t_handler (vl_api_netmap_delete_t * mp)
-{
- vlib_main_t *vm = vlib_get_main ();
- vl_api_netmap_delete_reply_t *rmp;
- int rv = 0;
- u8 *if_name = NULL;
-
- if_name = format (0, "%s", mp->netmap_if_name);
- vec_add1 (if_name, 0);
-
- rv = netmap_delete_if (vm, if_name);
-
- vec_free (if_name);
-
- REPLY_MACRO (VL_API_NETMAP_DELETE_REPLY);
-}
-
-static void
-vl_api_mpls_eth_tunnel_details_t_handler (vl_api_mpls_eth_tunnel_details_t *
- mp)
-{
- clib_warning ("BUG");
-}
-
-static void
-send_mpls_eth_tunnel_entry (vpe_api_main_t * am,
- unix_shared_memory_queue_t * q,
- mpls_eth_tunnel_t * et, u32 index, u32 context)
-{
- mpls_main_t *mm = &mpls_main;
- mpls_encap_t *e;
- int i;
- u32 nlabels;
- vl_api_mpls_eth_tunnel_details_t *mp;
-
- e = pool_elt_at_index (mm->encaps, et->encap_index);
- nlabels = vec_len (e->labels);
-
- mp = vl_msg_api_alloc (sizeof (*mp) + nlabels * sizeof (u32));
- memset (mp, 0, sizeof (*mp));
- mp->_vl_msg_id = ntohs (VL_API_MPLS_ETH_TUNNEL_DETAILS);
- mp->context = context;
-
- mp->tunnel_index = htonl (index);
- memcpy (mp->tunnel_dst_mac, et->tunnel_dst, 6);
- mp->intfc_address = et->intfc_address.as_u32;
- mp->tx_sw_if_index = htonl (et->tx_sw_if_index);
- mp->inner_fib_index = htonl (et->inner_fib_index);
- mp->mask_width = htonl (et->mask_width);
- mp->encap_index = htonl (et->encap_index);
- mp->hw_if_index = htonl (et->hw_if_index);
- mp->l2_only = htonl (et->l2_only);
- mp->nlabels = htonl (nlabels);
-
- for (i = 0; i < nlabels; i++)
- {
- mp->labels[i] =
- htonl (vnet_mpls_uc_get_label
- (clib_host_to_net_u32 (e->labels[i].label_exp_s_ttl)));