X-Git-Url: https://gerrit.fd.io/r/gitweb?a=blobdiff_plain;f=vpp%2Fvpp-api%2Fapi.c;h=330b9159e19401fd1a1b8c770fec71a3ad9108e6;hb=ed1c1835043a1d266a5928c40f41b340f6c968d7;hp=ff0e9e8218739497895a41c1fe87ccf46ac1646a;hpb=01b071222d99bea31e2846e95963c475262dd114;p=vpp.git diff --git a/vpp/vpp-api/api.c b/vpp/vpp-api/api.c index ff0e9e82187..330b9159e19 100644 --- a/vpp/vpp-api/api.c +++ b/vpp/vpp-api/api.c @@ -89,6 +89,7 @@ #include #include #include +#include #undef BIHASH_TYPE #undef __included_bihash_template_h__ @@ -110,6 +111,7 @@ #include #include #include +#include #include #include @@ -444,6 +446,8 @@ _(SET_IPFIX_CLASSIFY_STREAM, set_ipfix_classify_stream) \ _(IPFIX_CLASSIFY_STREAM_DUMP, ipfix_classify_stream_dump) \ _(IPFIX_CLASSIFY_TABLE_ADD_DEL, ipfix_classify_table_add_del) \ _(IPFIX_CLASSIFY_TABLE_DUMP, ipfix_classify_table_dump) \ +_(SW_INTERFACE_SPAN_ENABLE_DISABLE, sw_interface_span_enable_disable) \ +_(SW_INTERFACE_SPAN_DUMP, sw_interface_span_dump) \ _(GET_NEXT_INDEX, get_next_index) \ _(PG_CREATE_INTERFACE, pg_create_interface) \ _(PG_CAPTURE, pg_capture) \ @@ -463,7 +467,8 @@ _(IPSEC_SPD_DUMP, ipsec_spd_dump) \ _(IP_FIB_DUMP, ip_fib_dump) \ _(IP_FIB_DETAILS, ip_fib_details) \ _(IP6_FIB_DUMP, ip6_fib_dump) \ -_(IP6_FIB_DETAILS, ip6_fib_details) +_(IP6_FIB_DETAILS, ip6_fib_details) \ +_(FEATURE_ENABLE_DISABLE, feature_enable_disable) #define QUOTE_(x) #x #define QUOTE(x) QUOTE_(x) @@ -3919,7 +3924,9 @@ _(memory_size) \ _(skip_n_vectors) \ _(match_n_vectors) \ _(next_table_index) \ -_(miss_next_index) +_(miss_next_index) \ +_(current_data_flag) \ +_(current_data_offset) static void vl_api_classify_add_del_table_t_handler (vl_api_classify_add_del_table_t * mp) @@ -3938,17 +3945,25 @@ static void vl_api_classify_add_del_table_t_handler #undef _ /* The underlying API fails silently, on purpose, so check here */ - if (mp->is_add == 0) - if (pool_is_free_index (cm->tables, table_index)) - { - rv = VNET_API_ERROR_NO_SUCH_TABLE; - goto out; - } + if (mp->is_add == 0) /* delete */ + { + if (pool_is_free_index (cm->tables, table_index)) + { + rv = VNET_API_ERROR_NO_SUCH_TABLE; + goto out; + } + } + else /* add or update */ + { + if (table_index != ~0 && pool_is_free_index (cm->tables, table_index)) + table_index = ~0; + } rv = vnet_classify_add_del_table (cm, mp->mask, nbuckets, memory_size, skip_n_vectors, match_n_vectors, - next_table_index, miss_next_index, &table_index, mp->is_add); + next_table_index, miss_next_index, &table_index, + current_data_flag, current_data_offset, mp->is_add); out: /* *INDENT-OFF* */ @@ -3977,17 +3992,20 @@ static void vl_api_classify_add_del_session_t_handler vnet_classify_main_t *cm = &vnet_classify_main; vl_api_classify_add_del_session_reply_t *rmp; int rv; - u32 table_index, hit_next_index, opaque_index; + u32 table_index, hit_next_index, opaque_index, metadata; i32 advance; + u8 action; table_index = ntohl (mp->table_index); hit_next_index = ntohl (mp->hit_next_index); opaque_index = ntohl (mp->opaque_index); advance = ntohl (mp->advance); + action = mp->action; + metadata = ntohl (mp->metadata); rv = vnet_classify_add_del_session (cm, table_index, mp->match, hit_next_index, opaque_index, - advance, mp->is_add); + advance, action, metadata, mp->is_add); REPLY_MACRO (VL_API_CLASSIFY_ADD_DEL_SESSION_REPLY); } @@ -4311,7 +4329,7 @@ send_ip_address_details (vpe_api_main_t * am, else { u32 *tp = (u32 *) mp->ip; - *tp = ntohl (*(u32 *) ip); + *tp = *(u32 *) ip; } mp->prefix_length = prefix_length; mp->context = context; @@ -7589,6 +7607,33 @@ vl_api_mpls_fib_details_t_print (vl_api_mpls_fib_details_t * mp) clib_warning ("BUG"); } + +static void +copy_fib_next_hop (fib_route_path_encode_t * api_rpath, + vl_api_fib_path_t * fp) +{ + int is_ip4; + + if (api_rpath->rpath.frp_proto == FIB_PROTOCOL_IP4) + fp->afi = IP46_TYPE_IP4; + else if (api_rpath->rpath.frp_proto == FIB_PROTOCOL_IP6) + fp->afi = IP46_TYPE_IP6; + else + { + is_ip4 = ip46_address_is_ip4 (&api_rpath->rpath.frp_addr); + if (is_ip4) + fp->afi = IP46_TYPE_IP4; + else + fp->afi = IP46_TYPE_IP6; + } + if (fp->afi == IP46_TYPE_IP4) + memcpy (fp->next_hop, &api_rpath->rpath.frp_addr.ip4, + sizeof (api_rpath->rpath.frp_addr.ip4)); + else + memcpy (fp->next_hop, &api_rpath->rpath.frp_addr.ip6, + sizeof (api_rpath->rpath.frp_addr.ip6)); +} + static void send_mpls_fib_details (vpe_api_main_t * am, unix_shared_memory_queue_t * q, @@ -7598,7 +7643,7 @@ send_mpls_fib_details (vpe_api_main_t * am, vl_api_mpls_fib_details_t *mp; fib_route_path_encode_t *api_rpath; vl_api_fib_path_t *fp; - int is_ip4, path_count; + int path_count; path_count = vec_len (api_rpaths); mp = vl_msg_api_alloc (sizeof (*mp) + path_count * sizeof (*fp)); @@ -7619,19 +7664,7 @@ send_mpls_fib_details (vpe_api_main_t * am, memset (fp, 0, sizeof (*fp)); fp->weight = htonl (api_rpath->rpath.frp_weight); fp->sw_if_index = htonl (api_rpath->rpath.frp_sw_if_index); - memcpy (fp->next_hop, &api_rpath->rpath.frp_addr, sizeof (fp->next_hop)); - if (api_rpath->rpath.frp_proto == FIB_PROTOCOL_IP4) - fp->afi = IP46_TYPE_IP4; - else if (api_rpath->rpath.frp_proto == FIB_PROTOCOL_IP6) - fp->afi = IP46_TYPE_IP6; - else - { - is_ip4 = ip46_address_is_ip4 (&api_rpath->rpath.frp_addr); - if (is_ip4) - fp->afi = IP46_TYPE_IP4; - else - fp->afi = IP46_TYPE_IP6; - } + copy_fib_next_hop (api_rpath, fp); fp++; } @@ -7711,7 +7744,7 @@ send_ip_fib_details (vpe_api_main_t * am, vl_api_ip_fib_details_t *mp; fib_route_path_encode_t *api_rpath; vl_api_fib_path_t *fp; - int is_ip4, path_count; + int path_count; path_count = vec_len(api_rpaths); mp = vl_msg_api_alloc (sizeof (*mp) + path_count * sizeof (*fp)); @@ -7759,19 +7792,7 @@ send_ip_fib_details (vpe_api_main_t * am, } fp->weight = htonl(api_rpath->rpath.frp_weight); fp->sw_if_index = htonl(api_rpath->rpath.frp_sw_if_index); - memcpy(fp->next_hop, &api_rpath->rpath.frp_addr, sizeof(fp->next_hop)); - if (api_rpath->rpath.frp_proto == FIB_PROTOCOL_IP4) - fp->afi = IP46_TYPE_IP4; - else if (api_rpath->rpath.frp_proto == FIB_PROTOCOL_IP6) - fp->afi = IP46_TYPE_IP6; - else - { - is_ip4 = ip46_address_is_ip4 (&api_rpath->rpath.frp_addr); - if (is_ip4) - fp->afi = IP46_TYPE_IP4; - else - fp->afi = IP46_TYPE_IP6; - } + copy_fib_next_hop (api_rpath, fp); fp++; } @@ -7855,7 +7876,7 @@ send_ip6_fib_details (vpe_api_main_t * am, vl_api_ip6_fib_details_t *mp; fib_route_path_encode_t *api_rpath; vl_api_fib_path_t *fp; - int is_ip4, path_count; + int path_count; path_count = vec_len(api_rpaths); mp = vl_msg_api_alloc (sizeof (*mp) + path_count * sizeof (*fp)); @@ -7903,19 +7924,7 @@ send_ip6_fib_details (vpe_api_main_t * am, } fp->weight = htonl(api_rpath->rpath.frp_weight); fp->sw_if_index = htonl(api_rpath->rpath.frp_sw_if_index); - memcpy(fp->next_hop, &api_rpath->rpath.frp_addr, sizeof(fp->next_hop)); - if (api_rpath->rpath.frp_proto == FIB_PROTOCOL_IP4) - fp->afi = IP46_TYPE_IP4; - else if (api_rpath->rpath.frp_proto == FIB_PROTOCOL_IP6) - fp->afi = IP46_TYPE_IP6; - else - { - is_ip4 = ip46_address_is_ip4 (&api_rpath->rpath.frp_addr); - if (is_ip4) - fp->afi = IP46_TYPE_IP4; - else - fp->afi = IP46_TYPE_IP6; - } + copy_fib_next_hop (api_rpath, fp); fp++; } @@ -8594,6 +8603,52 @@ static void send_ipfix_classify_table_details (i, q, mp->context); } +static void + vl_api_sw_interface_span_enable_disable_t_handler + (vl_api_sw_interface_span_enable_disable_t * mp) +{ + vl_api_sw_interface_span_enable_disable_reply_t *rmp; + int rv; + + vlib_main_t *vm = vlib_get_main (); + + rv = span_add_delete_entry (vm, ntohl (mp->sw_if_index_from), + ntohl (mp->sw_if_index_to), mp->enable); + + REPLY_MACRO (VL_API_SW_INTERFACE_SPAN_ENABLE_DISABLE_REPLY); +} + +static void +vl_api_sw_interface_span_dump_t_handler (vl_api_sw_interface_span_dump_t * mp) +{ + + unix_shared_memory_queue_t *q; + vl_api_sw_interface_span_details_t *rmp; + span_main_t *sm = &span_main; + u32 src_sw_if_index = 0, *dst_sw_if_index; + + q = vl_api_client_index_to_input_queue (mp->client_index); + if (!q) + return; + + vec_foreach (dst_sw_if_index, sm->dst_by_src_sw_if_index) + { + if (*dst_sw_if_index > 0) + { + rmp = vl_msg_api_alloc (sizeof (*rmp)); + memset (rmp, 0, sizeof (*rmp)); + rmp->_vl_msg_id = ntohs (VL_API_SW_INTERFACE_SPAN_DETAILS); + rmp->context = mp->context; + + rmp->sw_if_index_from = htonl (src_sw_if_index); + rmp->sw_if_index_to = htonl (*dst_sw_if_index); + + vl_msg_api_send_shmem (q, (u8 *) & rmp); + } + src_sw_if_index++; + } +} + static void vl_api_pg_create_interface_t_handler (vl_api_pg_create_interface_t * mp) { @@ -9124,6 +9179,46 @@ vl_api_ipsec_spd_dump_t_handler (vl_api_ipsec_spd_dump_t * mp) #endif } +static void +vl_api_feature_enable_disable_t_handler (vl_api_feature_enable_disable_t * mp) +{ + vl_api_feature_enable_disable_reply_t *rmp; + int rv = 0; + + u8 *arc_name = format (0, "%s%c", mp->arc_name, 0); + u8 *feature_name = format (0, "%s%c", mp->feature_name, 0); + + vnet_feature_registration_t *reg; + reg = + vnet_get_feature_reg ((const char *) arc_name, + (const char *) feature_name); + if (reg == 0) + rv = VNET_API_ERROR_INVALID_VALUE; + else + { + u32 sw_if_index; + clib_error_t *error = 0; + + sw_if_index = ntohl (mp->sw_if_index); + if (reg->enable_disable_cb) + error = reg->enable_disable_cb (sw_if_index, mp->enable); + if (!error) + vnet_feature_enable_disable ((const char *) arc_name, + (const char *) feature_name, + sw_if_index, mp->enable, 0, 0); + else + { + clib_error_report (error); + rv = VNET_API_ERROR_CANNOT_ENABLE_DISABLE_FEATURE; + } + } + + vec_free (feature_name); + vec_free (arc_name); + + REPLY_MACRO (VL_API_FEATURE_ENABLE_DISABLE_REPLY); +} + #define BOUNCE_HANDLER(nn) \ static void vl_api_##nn##_t_handler ( \ vl_api_##nn##_t *mp) \ @@ -9154,6 +9249,8 @@ static void vl_api_##nn##_t_handler ( \ vl_msg_api_free (mp); \ } +static void setup_message_id_table (api_main_t * am); + /* * vpe_api_hookup * Add vpe's API message handlers to the table. @@ -9161,7 +9258,6 @@ static void vl_api_##nn##_t_handler ( \ * added the client registration handlers. * See .../open-repo/vlib/memclnt_vlib.c:memclnt_process() */ - static clib_error_t * vpe_api_hookup (vlib_main_t * vm) { @@ -9215,6 +9311,11 @@ vpe_api_hookup (vlib_main_t * vm) am->is_mp_safe[VL_API_IP_ADD_DEL_ROUTE] = 1; am->is_mp_safe[VL_API_GET_NODE_GRAPH] = 1; + /* + * Set up the (msg_name, crc, message-id) table + */ + setup_message_id_table (am); + return 0; } @@ -9368,24 +9469,6 @@ get_unformat_vnet_sw_interface (void) return (void *) &unformat_vnet_sw_interface; } -#undef vl_api_version -#define vl_api_version(n,v) static u32 vpe_api_version = v; -#include -#undef vl_api_version - -int -vl_msg_api_version_check (vl_api_memclnt_create_t * mp) -{ - if (clib_host_to_net_u32 (mp->api_versions[0]) != vpe_api_version) - { - clib_warning ("vpe API mismatch: 0x%08x instead of 0x%08x", - clib_host_to_net_u32 (mp->api_versions[0]), - vpe_api_version); - return -1; - } - return 0; -} - static u8 * format_arp_event (u8 * s, va_list * args) { @@ -9449,6 +9532,20 @@ VLIB_CLI_COMMAND (show_ip_arp_nd_events, static) = { }; /* *INDENT-ON* */ +#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_memclnt; + foreach_vl_msg_name_crc_vpe; +#undef _ +} + + /* * fd.io coding-style-patch-verification: ON *