X-Git-Url: https://gerrit.fd.io/r/gitweb?a=blobdiff_plain;f=src%2Fplugins%2Facl%2Facl.c;h=01a1e87a29bf96020cbe41ab93383b0b02d3fdec;hb=5e6a1651c4759eac56a0409a75e6d3b75511d234;hp=7cde5ce60ad4985fcaac9d552b9ee1da542e2a42;hpb=803c1623c255a6ffbc41e81a1bbd17bffba2ed05;p=vpp.git diff --git a/src/plugins/acl/acl.c b/src/plugins/acl/acl.c index 7cde5ce60ad..01a1e87a29b 100644 --- a/src/plugins/acl/acl.c +++ b/src/plugins/acl/acl.c @@ -216,7 +216,8 @@ static void ntohs (VL_API_ACL_PLUGIN_GET_CONN_TABLE_MAX_ENTRIES_REPLY + am->msg_id_base); rmp->context = mp->context; - rmp->conn_table_max_entries = __bswap_64 (am->fa_conn_table_max_entries); + rmp->conn_table_max_entries = + clib_net_to_host_u64 (am->fa_conn_table_max_entries); vl_api_send_msg (rp, (u8 *) rmp); } @@ -320,8 +321,13 @@ acl_add_list (u32 count, vl_api_acl_rule_t rules[], acl_list_t *a; acl_rule_t *r; acl_rule_t *acl_new_rules = 0; + size_t tag_len; int i; + tag_len = clib_strnlen ((const char *) tag, sizeof (a->tag)); + if (tag_len == sizeof (a->tag)) + return VNET_API_ERROR_INVALID_VALUE; + if (am->trace_acl > 255) clib_warning ("API dbg: acl_add_list index %d tag %s", *acl_list_index, tag); @@ -399,7 +405,7 @@ acl_add_list (u32 count, vl_api_acl_rule_t rules[], vec_free (a->rules); } a->rules = acl_new_rules; - memcpy (a->tag, tag, sizeof (a->tag)); + memcpy (a->tag, tag, tag_len + 1); if (am->trace_acl > 255) warning_acl_print_acl (am->vlib_main, am, *acl_list_index); if (am->reclassify_sessions) @@ -1548,9 +1554,14 @@ macip_acl_add_list (u32 count, vl_api_macip_acl_rule_t rules[], macip_acl_list_t *a; macip_acl_rule_t *r; macip_acl_rule_t *acl_new_rules = 0; + size_t tag_len; int i; int rv = 0; + tag_len = clib_strnlen ((const char *) tag, sizeof (a->tag)); + if (tag_len == sizeof (a->tag)) + return VNET_API_ERROR_INVALID_VALUE; + if (*acl_list_index != ~0) { /* They supplied some number, let's see if this MACIP ACL exists */ @@ -1609,7 +1620,7 @@ macip_acl_add_list (u32 count, vl_api_macip_acl_rule_t rules[], a->rules = acl_new_rules; a->count = count; - memcpy (a->tag, tag, sizeof (a->tag)); + memcpy (a->tag, tag, tag_len + 1); /* Create and populate the classifier tables */ macip_create_classify_tables (am, *acl_list_index); @@ -1761,7 +1772,7 @@ macip_acl_interface_add_del_acl (u32 sw_if_index, u8 is_add, * */ static int -verify_message_len (void *mp, u32 expected_len, char *where) +verify_message_len (void *mp, u64 expected_len, char *where) { u32 supplied_len = vl_msg_api_get_msg_length (mp); if (supplied_len < expected_len) @@ -1785,7 +1796,7 @@ vl_api_acl_add_replace_t_handler (vl_api_acl_add_replace_t * mp) int rv; u32 acl_list_index = ntohl (mp->acl_index); u32 acl_count = ntohl (mp->count); - u32 expected_len = sizeof (*mp) + acl_count * sizeof (mp->r[0]); + u64 expected_len = sizeof (*mp) + acl_count * sizeof (mp->r[0]); if (verify_message_len (mp, expected_len, "acl_add_replace")) { @@ -1936,7 +1947,7 @@ send_acl_details (acl_main_t * am, vl_api_registration_t * reg, mp->context = context; mp->count = htonl (vec_len (acl_rules)); mp->acl_index = htonl (acl - am->acls); - memcpy (mp->tag, acl->tag, sizeof (mp->tag)); + snprintf ((char *) mp->tag, sizeof (mp->tag), "%s", acl->tag); // clib_memcpy (mp->r, acl->rules, acl->count * sizeof(acl->rules[0])); rules = mp->r; for (i = 0; i < vec_len (acl_rules); i++) @@ -2074,7 +2085,7 @@ vl_api_macip_acl_add_t_handler (vl_api_macip_acl_add_t * mp) int rv; u32 acl_list_index = ~0; u32 acl_count = ntohl (mp->count); - u32 expected_len = sizeof (*mp) + acl_count * sizeof (mp->r[0]); + u64 expected_len = sizeof (*mp) + acl_count * sizeof (mp->r[0]); if (verify_message_len (mp, expected_len, "macip_acl_add")) { @@ -2101,7 +2112,7 @@ vl_api_macip_acl_add_replace_t_handler (vl_api_macip_acl_add_replace_t * mp) int rv; u32 acl_list_index = ntohl (mp->acl_index); u32 acl_count = ntohl (mp->count); - u32 expected_len = sizeof (*mp) + acl_count * sizeof (mp->r[0]); + u64 expected_len = sizeof (*mp) + acl_count * sizeof (mp->r[0]); if (verify_message_len (mp, expected_len, "macip_acl_add_replace")) { @@ -2170,7 +2181,7 @@ send_macip_acl_details (acl_main_t * am, vl_api_registration_t * reg, mp->context = context; if (acl) { - memcpy (mp->tag, acl->tag, sizeof (mp->tag)); + snprintf ((char *) mp->tag, sizeof (mp->tag), "%s", acl->tag); mp->count = htonl (acl->count); mp->acl_index = htonl (acl - am->macip_acls); rules = mp->r; @@ -2439,6 +2450,45 @@ static void } } +static void +vl_api_acl_plugin_use_hash_lookup_set_t_handler ( + vl_api_acl_plugin_use_hash_lookup_set_t *mp) +{ + acl_main_t *am = &acl_main; + vl_api_acl_plugin_use_hash_lookup_set_reply_t *rmp; + vl_api_registration_t *reg; + int rv = 0; + + reg = vl_api_client_index_to_registration (mp->client_index); + if (!reg) + return; + + am->use_hash_acl_matching = mp->enable; + REPLY_MACRO (VL_API_ACL_PLUGIN_USE_HASH_LOOKUP_SET_REPLY); +} + +static void +vl_api_acl_plugin_use_hash_lookup_get_t_handler ( + vl_api_acl_plugin_use_hash_lookup_get_t *mp) +{ + acl_main_t *am = &acl_main; + vl_api_acl_plugin_use_hash_lookup_get_reply_t *rmp; + int msg_size = sizeof (*rmp); + vl_api_registration_t *reg; + + reg = vl_api_client_index_to_registration (mp->client_index); + if (!reg) + return; + + rmp = vl_msg_api_alloc (msg_size); + clib_memset (rmp, 0, msg_size); + rmp->_vl_msg_id = + ntohs (VL_API_ACL_PLUGIN_USE_HASH_LOOKUP_GET_REPLY + am->msg_id_base); + rmp->context = mp->context; + rmp->enable = am->use_hash_acl_matching; + vl_api_send_msg (reg, (u8 *) rmp); +} + static void acl_set_timeout_sec (int timeout_type, u32 value) { @@ -2826,8 +2876,7 @@ acl_set_aclplugin_acl_fn (vlib_main_t * vm, u32 port2 = 0; u32 action = 0; u32 tcpflags, tcpmask; - u32 src_prefix_length = 0, dst_prefix_length = 0; - ip46_address_t src, dst; + ip_prefix_t src, dst; u8 *tag = 0; if (!unformat_user (input, unformat_line_input, line_input)) @@ -2859,25 +2908,15 @@ acl_set_aclplugin_acl_fn (vlib_main_t * vm, vec_validate_acl_rules (rules, rule_idx); rules[rule_idx].is_permit = action; } - else if (unformat (line_input, "src %U/%d", - unformat_ip46_address, &src, IP46_TYPE_ANY, - &src_prefix_length)) + else if (unformat (line_input, "src %U", unformat_ip_prefix, &src)) { vec_validate_acl_rules (rules, rule_idx); - ip_address_encode (&src, IP46_TYPE_ANY, - &rules[rule_idx].src_prefix.address); - rules[rule_idx].src_prefix.address.af = ADDRESS_IP4; - rules[rule_idx].src_prefix.len = src_prefix_length; + ip_prefix_encode2 (&src, &rules[rule_idx].src_prefix); } - else if (unformat (line_input, "dst %U/%d", - unformat_ip46_address, &dst, IP46_TYPE_ANY, - &dst_prefix_length)) + else if (unformat (line_input, "dst %U", unformat_ip_prefix, &dst)) { vec_validate_acl_rules (rules, rule_idx); - ip_address_encode (&dst, IP46_TYPE_ANY, - &rules[rule_idx].dst_prefix.address); - rules[rule_idx].dst_prefix.address.af = ADDRESS_IP4; - rules[rule_idx].dst_prefix.len = dst_prefix_length; + ip_prefix_encode2 (&dst, &rules[rule_idx].dst_prefix); } else if (unformat (line_input, "sport %d-%d", &port1, &port2)) { @@ -2936,7 +2975,6 @@ acl_set_aclplugin_acl_fn (vlib_main_t * vm, u32 acl_index = ~0; if (!tag) vec_add (tag, "cli", 4); - vec_validate (tag, STRUCT_SIZE_OF (acl_list_t, tag) - 1); rv = acl_add_list (vec_len (rules), rules, &acl_index, tag); @@ -3433,6 +3471,8 @@ acl_show_aclplugin_tables_fn (vlib_main_t * vm, } vlib_cli_output (vm, "Stats counters enabled for interface ACLs: %d", acl_main.interface_acl_counters_enabled); + vlib_cli_output (vm, "Use hash-based lookup for ACLs: %d", + acl_main.use_hash_acl_matching); if (show_mask_type) acl_plugin_show_tables_mask_type (); if (show_acl_hash_info) @@ -3549,16 +3589,15 @@ VLIB_CLI_COMMAND (aclplugin_set_interface_command, static) = { * an ACL is composed of more than one Access control element (ACE). Multiple * ACEs can be specified with this command using a comma separated list. * - * Each ACE describes a tuple of src+dst IP prefix, ip protocol, src+dst port ranges. - * (the ACL plugin also support ICMP types/codes instead of UDP/TCP ports, but - * this CLI does not). + * Each ACE describes a tuple of src+dst IP prefix, ip protocol, src+dst port + * ranges. (the ACL plugin also support ICMP types/codes instead of UDP/TCP + * ports, but this CLI does not). * - * An ACL can optionally be assigned a 'tag' - which is an identifier understood - * by the client. VPP does not examine it in any way. + * An ACL can optionally be assigned a 'tag' - which is an identifier + * understood by the client. VPP does not examine it in any way. * - * @cliexpar - * set acl-plugin acl src dst proto sport dport [tag FOO] - * @cliexend + * @cliexcmd{set acl-plugin acl src dst proto + * sport dport [tag FOO]} ?*/ VLIB_CLI_COMMAND (aclplugin_set_acl_command, static) = { .path = "set acl-plugin acl",