X-Git-Url: https://gerrit.fd.io/r/gitweb?a=blobdiff_plain;ds=sidebyside;f=src%2Fvnet%2Fpolicer%2Fpolicer_api.c;h=1382d17e2de75156fd59eff428450bf05b631335;hb=1953da661069c967f1159162dc65c9a1210fcdbd;hp=3dc2cdd6a0aee6a316c6d2bfdbf51c60f7e0bb09;hpb=d91c1dbdb31f80db7d967f2f57c43d0a81d65297;p=vpp.git diff --git a/src/vnet/policer/policer_api.c b/src/vnet/policer/policer_api.c index 3dc2cdd6a0a..1382d17e2de 100644 --- a/src/vnet/policer/policer_api.c +++ b/src/vnet/policer/policer_api.c @@ -24,28 +24,13 @@ #include #include -#include - -#define vl_typedefs /* define message structures */ -#include -#undef vl_typedefs - -#define vl_endianfun /* define message structures */ -#include -#undef vl_endianfun - -/* instantiate all the print functions we know about */ -#define vl_print(handle, ...) vlib_cli_output (handle, __VA_ARGS__) -#define vl_printfun -#include -#undef vl_printfun +#include +#include +#include +#define REPLY_MSG_ID_BASE vnet_policer_main.msg_id_base #include -#define foreach_vpe_api_msg \ -_(POLICER_ADD_DEL, policer_add_del) \ -_(POLICER_DUMP, policer_dump) - static void vl_api_policer_add_del_t_handler (vl_api_policer_add_del_t * mp) { @@ -53,26 +38,30 @@ vl_api_policer_add_del_t_handler (vl_api_policer_add_del_t * mp) vl_api_policer_add_del_reply_t *rmp; int rv = 0; u8 *name = NULL; - sse2_qos_pol_cfg_params_st cfg; + qos_pol_cfg_params_st cfg; clib_error_t *error; u32 policer_index; name = format (0, "%s", mp->name); + vec_terminate_c_string (name); - memset (&cfg, 0, sizeof (cfg)); - cfg.rfc = mp->type; - cfg.rnd_type = mp->round_type; - cfg.rate_type = mp->rate_type; + clib_memset (&cfg, 0, sizeof (cfg)); + cfg.rfc = (qos_policer_type_en) mp->type; + cfg.rnd_type = (qos_round_type_en) mp->round_type; + cfg.rate_type = (qos_rate_type_en) mp->rate_type; cfg.rb.kbps.cir_kbps = ntohl (mp->cir); cfg.rb.kbps.eir_kbps = ntohl (mp->eir); cfg.rb.kbps.cb_bytes = clib_net_to_host_u64 (mp->cb); cfg.rb.kbps.eb_bytes = clib_net_to_host_u64 (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.conform_action.action_type = + (qos_action_type_en) mp->conform_action.type; + cfg.conform_action.dscp = mp->conform_action.dscp; + cfg.exceed_action.action_type = (qos_action_type_en) mp->exceed_action.type; + cfg.exceed_action.dscp = mp->exceed_action.dscp; + cfg.violate_action.action_type = + (qos_action_type_en) mp->violate_action.type; + cfg.violate_action.dscp = mp->violate_action.dscp; + cfg.color_aware = mp->color_aware; error = policer_add_del (vm, name, &cfg, &policer_index, mp->is_add); @@ -92,30 +81,76 @@ vl_api_policer_add_del_t_handler (vl_api_policer_add_del_t * mp) } 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_bind_t_handler (vl_api_policer_bind_t *mp) +{ + vl_api_policer_bind_reply_t *rmp; + u8 *name; + u32 worker_index; + u8 bind_enable; + int rv; + + name = format (0, "%s", mp->name); + vec_terminate_c_string (name); + + worker_index = ntohl (mp->worker_index); + bind_enable = mp->bind_enable; + + rv = policer_bind_worker (name, worker_index, bind_enable); + vec_free (name); + REPLY_MACRO (VL_API_POLICER_BIND_REPLY); +} + +static void +vl_api_policer_input_t_handler (vl_api_policer_input_t *mp) +{ + vl_api_policer_bind_reply_t *rmp; + u8 *name; + u32 sw_if_index; + u8 apply; + int rv; + + VALIDATE_SW_IF_INDEX (mp); + + name = format (0, "%s", mp->name); + vec_terminate_c_string (name); + + sw_if_index = ntohl (mp->sw_if_index); + apply = mp->apply; + + rv = policer_input (name, sw_if_index, apply); + vec_free (name); + + BAD_SW_IF_INDEX_LABEL; + REPLY_MACRO (VL_API_POLICER_INPUT_REPLY); +} + +static void +send_policer_details (u8 *name, qos_pol_cfg_params_st *config, + policer_t *templ, vl_api_registration_t *reg, + 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); + clib_memset (mp, 0, sizeof (*mp)); + mp->_vl_msg_id = ntohs (REPLY_MSG_ID_BASE + 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 = clib_host_to_net_u64 (config->rb.kbps.cb_bytes); mp->eb = clib_host_to_net_u64 (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->rate_type = (vl_api_sse2_qos_rate_type_t) config->rate_type; + mp->round_type = (vl_api_sse2_qos_round_type_t) config->rnd_type; + mp->type = (vl_api_sse2_qos_policer_type_t) config->rfc; + mp->conform_action.type = + (vl_api_sse2_qos_action_type_t) config->conform_action.action_type; + mp->conform_action.dscp = config->conform_action.dscp; + mp->exceed_action.type = + (vl_api_sse2_qos_action_type_t) config->exceed_action.action_type; + mp->exceed_action.dscp = config->exceed_action.dscp; + mp->violate_action.type = + (vl_api_sse2_qos_action_type_t) config->violate_action.action_type; + mp->violate_action.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); @@ -129,29 +164,30 @@ send_policer_details (u8 * name, strncpy ((char *) mp->name, (char *) name, ARRAY_LEN (mp->name) - 1); - vl_msg_api_send_shmem (q, (u8 *) & mp); + vl_api_send_msg (reg, (u8 *) mp); } static void vl_api_policer_dump_t_handler (vl_api_policer_dump_t * mp) { - unix_shared_memory_queue_t *q; + vl_api_registration_t *reg; 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; + qos_pol_cfg_params_st *config; + policer_t *templ; - q = vl_api_client_index_to_input_queue (mp->client_index); - if (q == 0) + reg = vl_api_client_index_to_registration (mp->client_index); + if (!reg) return; if (mp->match_name_valid) { match_name = format (0, "%s%c", mp->match_name, 0); + vec_terminate_c_string (match_name); } if (mp->match_name_valid) @@ -162,7 +198,7 @@ vl_api_policer_dump_t_handler (vl_api_policer_dump_t * mp) 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); + send_policer_details (match_name, config, templ, reg, mp->context); } } else @@ -174,49 +210,20 @@ vl_api_policer_dump_t_handler (vl_api_policer_dump_t * mp) 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); + send_policer_details(name, config, templ, reg, mp->context); })); /* *INDENT-ON* */ } } -/* - * policer_api_hookup - * Add vpe's API message handlers to the table. - * vlib has alread mapped shared memory and - * added the client registration handlers. - * See .../vlib-api/vlibmemory/memclnt_vlib.c:memclnt_process() - */ -#define vl_msg_name_crc_list -#include -#undef vl_msg_name_crc_list - -static void -setup_message_id_table (api_main_t * am) -{ -#define _(id,n,crc) vl_msg_api_add_msg_name_crc (am, #n "_" #crc, id); - foreach_vl_msg_name_crc_policer; -#undef _ -} - +#include static clib_error_t * policer_api_hookup (vlib_main_t * vm) { - api_main_t *am = &api_main; - -#define _(N,n) \ - vl_msg_api_set_handlers(VL_API_##N, #n, \ - vl_api_##n##_t_handler, \ - vl_noop_handler, \ - vl_api_##n##_t_endian, \ - vl_api_##n##_t_print, \ - sizeof(vl_api_##n##_t), 1); - foreach_vpe_api_msg; -#undef _ /* * Set up the (msg_name, crc, message-id) table */ - setup_message_id_table (am); + REPLY_MSG_ID_BASE = setup_message_id_table (); return 0; }