openappsec/components/utils/pm/kiss_pm_stats.h
2022-10-26 19:33:19 +03:00

147 lines
4.8 KiB
C

// Copyright (C) 2022 Check Point Software Technologies Ltd. All rights reserved.
// Licensed under the Apache License, Version 2.0 (the "License");
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
#ifndef __kiss_pm_stats_h__
#define __kiss_pm_stats_h__
#include "pm_adaptor.h"
// Common statistics
// Common run time statistics
struct kiss_pm_stats_dynamic_s {
u_int num_of_buffs; // Number of buffers we ran this dfa on
u_int num_of_matches; // how many matches there were in this dfa
u_int max_matches_on_buf; // Maximal number of matches per one buf
struct { // Buffer length statistics
u_int max; // Maximum buffer length
u_int total; // Total length (for average calculation)
u_int sample_num; // Number of buffers, whose lengths make up total.
} buflen;
struct { // Execution time statistics - not collected by default
u_int total_exec_time; // PM Execution time (not including user callbacks)
u_int max_exec_time; // Maximal PM execution time
u_int user_cb_exec_time; // User callback execution time
u_int user_cb_max_time; // Maximal user callback execution time
u_int sample_num; // Number of execution time samples
} runtime;
u_int num_of_stage1_matches; // Tier1 LSS matches, before filtering by mask
u_int num_of_stage22_matches; // Tier1 matches after ^
u_int num_of_stage23_matches; // Tier1 matches after $
};
// Common build time statistics
struct kiss_pm_stats_static_s {
u_int memory_bytes; // How many bytes does this tier consume
u_int compilation_time; // Compilation time of this tier in micro-seconds
};
struct CP_CACHELINE_ALIGNED kiss_pm_stats_dynamic_aligned_s {
struct kiss_pm_stats_dynamic_s stats;
};
struct kiss_pm_stats_common_s {
// Run time statistics, per-CPU, dynamically allocated
struct kiss_pm_stats_dynamic_aligned_s* exec;
// Size of the exec array
u_int exec_num_cpus;
// Build time statistics
struct kiss_pm_stats_static_s compile;
};
typedef struct kiss_pm_stats_common_s *kiss_pm_stats_common;
enum kiss_pm_stats_update_compile_type {
UPDATE_COMPILE_STATS_MEM,
UPDATE_COMPILE_STATS_TIME,
UPDATE_COMPILE_STATS_BOTH
};
// In which format the statistics should be printed
enum kiss_pm_stats_format {
KISS_PM_TEXT_FORMAT_STATS = 0, // Textual, for viewing with text editor
KISS_PM_CSV_FORMAT_STATS // CSV, for opening with Excel
};
KISS_APPS_CPAPI
kiss_ret_val kiss_pm_stats_common_init(kiss_pm_stats_common new_stats);
KISS_APPS_CPAPI
void kiss_pm_stats_common_free(kiss_pm_stats_common stats);
KISS_APPS_CPAPI
void kiss_pm_stats_common_update_compile(
kiss_pm_stats_common stats,
u_int bytes,
u_int compilation_time,
enum kiss_pm_stats_update_compile_type type);
KISS_APPS_CPAPI
void kiss_pm_stats_common_update_exec(kiss_pm_stats_common stats, u_int buf_size, u_int num_of_matches);
// @brief
// Updating the execution time of an execution of a buffer in tier2.
//
// @param stats - [in] The tier2 common stats.
// @param exec_time - [in] The execution time.
// @param buf_len - [in] the length of the last buffer that was executed
//
// @return Void
//
// @note
// in case one of the stats vars will warp-around, the aggregated vars will hold only the last exec stats.
KISS_APPS_CPAPI
void kiss_pm_stats_common_update_exec_time(kiss_pm_stats_common stats, u_int exec_time, u_int user_cb_time);
KISS_APPS_CPAPI
void kiss_pm_stats_common_reset_exec(kiss_pm_stats_common stats);
KISS_APPS_CPAPI
void kiss_pm_stats_common_print(
kiss_pm_stats_common stats,
enum kiss_pm_stats_type type,
enum kiss_pm_stats_format format,
BOOL print_headline
);
KISS_APPS_CPAPI
kiss_ret_val kiss_pm_stats_common_get(
struct kiss_pm_stats_static_s *dst_compile,
struct kiss_pm_stats_dynamic_s *dst_exec,
const struct kiss_pm_stats_common_s *src
);
KISS_APPS_CPAPI
kiss_ret_val kiss_pm_stats_common_copy(kiss_pm_stats_common dst, const struct kiss_pm_stats_common_s *src);
KISS_APPS_CPAPI
u_int kiss_pm_stats_common_get_serialize_size(void);
KISS_APPS_CPAPI
kiss_ret_val kiss_pm_stats_common_serialize(const struct kiss_pm_stats_common_s *stats, u_char **buf, u_int *size);
KISS_APPS_CPAPI
kiss_ret_val kiss_pm_stats_common_deserialize(
kiss_pm_stats_common stats,
u_char **buf,
u_int *size,
kiss_vbuf vbuf,
kiss_vbuf_iter *vbuf_iter
);
#endif // __kiss_pm_stats_h__