void SCProfilingDumpPacketStats(void);
const char * PacketProfileDetectIdToString(PacketProfileDetectId id);
const char * PacketProfileLoggertIdToString(LoggerId id);
+static void PrintCSVHeader(void);
static void FormatNumber(uint64_t num, char *str, size_t size)
{
conf = ConfGetNode("profiling.packets.csv");
if (conf != NULL) {
if (ConfNodeChildValueIsTrue(conf, "enabled")) {
-
const char *filename = ConfNodeLookupChildValue(conf, "filename");
if (filename == NULL) {
filename = "packet_profile.csv";
}
- const char *log_dir;
- log_dir = ConfigGetLogDirectory();
+ const char *log_dir = ConfigGetLogDirectory();
profiling_csv_file_name = SCMalloc(PATH_MAX);
if (unlikely(profiling_csv_file_name == NULL)) {
packet_profile_csv_fp = fopen(profiling_csv_file_name, "w");
if (packet_profile_csv_fp == NULL) {
+ SCFree(profiling_csv_file_name);
+ profiling_csv_file_name = NULL;
return;
}
- fprintf(packet_profile_csv_fp, "pcap_cnt,ipver,ipproto,total,");
- int i;
- for (i = 0; i < TMM_SIZE; i++) {
- fprintf(packet_profile_csv_fp, "%s,", TmModuleTmmIdToString(i));
- }
- fprintf(packet_profile_csv_fp, "threading,");
- for (i = 0; i < ALPROTO_MAX; i++) {
- fprintf(packet_profile_csv_fp, "%s,", AppProtoToString(i));
- }
- fprintf(packet_profile_csv_fp, "proto detect,");
- for (i = 0; i < PROF_DETECT_SIZE; i++) {
- fprintf(packet_profile_csv_fp, "%s,", PacketProfileDetectIdToString(i));
- }
- fprintf(packet_profile_csv_fp, "\n");
+
+ PrintCSVHeader();
profiling_packets_csv_enabled = 1;
}
fclose(fp);
}
+static void PrintCSVHeader(void)
+{
+ fprintf(packet_profile_csv_fp, "pcap_cnt,total,receive,decode,flowworker,");
+ fprintf(packet_profile_csv_fp, "threading,");
+ fprintf(packet_profile_csv_fp, "proto detect,");
+
+ for (enum ProfileFlowWorkerId fwi = 0; fwi < PROFILE_FLOWWORKER_SIZE; fwi++) {
+ fprintf(packet_profile_csv_fp, "%s,", ProfileFlowWorkerIdToString(fwi));
+ }
+ fprintf(packet_profile_csv_fp, "loggers,");
+
+ /* detect stages */
+ for (int i = 0; i < PROF_DETECT_SIZE; i++) {
+ fprintf(packet_profile_csv_fp, "%s,", PacketProfileDetectIdToString(i));
+ }
+
+ /* individual loggers */
+ for (LoggerId i = 0; i < LOGGER_SIZE; i++) {
+ fprintf(packet_profile_csv_fp, "%s,", PacketProfileLoggertIdToString(i));
+ }
+
+ fprintf(packet_profile_csv_fp, "\n");
+}
+
void SCProfilingPrintPacketProfile(Packet *p)
{
- if (profiling_packets_csv_enabled == 0 || p == NULL || packet_profile_csv_fp == NULL || p->profile == NULL) {
+ if (profiling_packets_csv_enabled == 0 || p == NULL ||
+ packet_profile_csv_fp == NULL || p->profile == NULL) {
return;
}
+ uint64_t tmm_total = 0;
+ uint64_t receive = 0;
+ uint64_t decode = 0;
+
+ /* total cost from acquisition to return to packetpool */
uint64_t delta = p->profile->ticks_end - p->profile->ticks_start;
+ fprintf(packet_profile_csv_fp, "%"PRIu64",%"PRIu64",",
+ p->pcap_cnt, delta);
- fprintf(packet_profile_csv_fp, "%"PRIu64",%c,%"PRIu8",%"PRIu64",",
- p->pcap_cnt, PKT_IS_IPV4(p) ? '4' : (PKT_IS_IPV6(p) ? '6' : '?'), p->proto,
- delta);
+ for (int i = 0; i < TMM_SIZE; i++) {
+ const PktProfilingTmmData *pdt = &p->profile->tmm[i];
+ uint64_t tmm_delta = pdt->ticks_end - pdt->ticks_start;
- int i;
- uint64_t tmm_total = 0;
+ if (tmm_modules[i].flags & TM_FLAG_RECEIVE_TM) {
+ if (tmm_delta) {
+ receive = tmm_delta;
+ }
+ continue;
- for (i = 0; i < TMM_SIZE; i++) {
- PktProfilingTmmData *pdt = &p->profile->tmm[i];
+ } else if (tmm_modules[i].flags & TM_FLAG_DECODE_TM) {
+ if (tmm_delta) {
+ decode = tmm_delta;
+ }
+ continue;
+ }
- uint64_t tmm_delta = pdt->ticks_end - pdt->ticks_start;
- fprintf(packet_profile_csv_fp, "%"PRIu64",", tmm_delta);
tmm_total += tmm_delta;
}
-
+ fprintf(packet_profile_csv_fp, "%"PRIu64",", receive);
+ fprintf(packet_profile_csv_fp, "%"PRIu64",", decode);
+ PktProfilingTmmData *fw_pdt = &p->profile->tmm[TMM_FLOWWORKER];
+ fprintf(packet_profile_csv_fp, "%"PRIu64",", fw_pdt->ticks_end - fw_pdt->ticks_start);
fprintf(packet_profile_csv_fp, "%"PRIu64",", delta - tmm_total);
+ /* count ticks for app layer */
uint64_t app_total = 0;
- for (i = 0; i < ALPROTO_MAX; i++) {
- PktProfilingAppData *pdt = &p->profile->app[i];
-
- fprintf(packet_profile_csv_fp,"%"PRIu64",", pdt->ticks_spent);
+ for (AppProto i = 1; i < ALPROTO_FAILED; i++) {
+ const PktProfilingAppData *pdt = &p->profile->app[i];
if (p->proto == IPPROTO_TCP) {
app_total += pdt->ticks_spent;
fprintf(packet_profile_csv_fp, "%"PRIu64",", p->profile->proto_detect);
- for (i = 0; i < PROF_DETECT_SIZE; i++) {
- PktProfilingDetectData *pdt = &p->profile->detect[i];
+ /* print flowworker steps */
+ for (enum ProfileFlowWorkerId fwi = 0; fwi < PROFILE_FLOWWORKER_SIZE; fwi++) {
+ const PktProfilingData *pd = &p->profile->flowworker[fwi];
+ uint64_t ticks_spent = pd->ticks_end - pd->ticks_start;
+ if (fwi == PROFILE_FLOWWORKER_STREAM) {
+ ticks_spent -= app_total;
+ } else if (fwi == PROFILE_FLOWWORKER_APPLAYERUDP && app_total) {
+ ticks_spent = app_total;
+ }
+
+ fprintf(packet_profile_csv_fp, "%"PRIu64",", ticks_spent);
+ }
+
+ /* count loggers cost and print as a single cost */
+ uint64_t loggers = 0;
+ for (LoggerId i = 0; i < LOGGER_SIZE; i++) {
+ const PktProfilingLoggerData *pd = &p->profile->logger[i];
+ loggers += pd->ticks_spent;
+ }
+ fprintf(packet_profile_csv_fp, "%"PRIu64",", loggers);
+
+ /* detect steps */
+ for (int i = 0; i < PROF_DETECT_SIZE; i++) {
+ const PktProfilingDetectData *pdt = &p->profile->detect[i];
fprintf(packet_profile_csv_fp,"%"PRIu64",", pdt->ticks_spent);
}
+
+ /* print individual loggers */
+ for (LoggerId i = 0; i < LOGGER_SIZE; i++) {
+ const PktProfilingLoggerData *pd = &p->profile->logger[i];
+ fprintf(packet_profile_csv_fp, "%"PRIu64",", pd->ticks_spent);
+ }
+
fprintf(packet_profile_csv_fp,"\n");
}