void update_reports(struct urb* urb) { if (urb->dir == DIR_TO_DEVICE) { // Only care about class requests if (urb->func != FUNC_CLASS_INTERFACE) return; if (urb->request == REQ_GET_REPORT) { add_report(urb); } else if (urb->request == REQ_SET_REPORT) { display_report(urb); del_report(urb); } } else { if (urb->func == FUNC_CONTROL_TXFER) { if (check_and_update_report(urb)) display_report(urb); } else if (urb->data && urb->func == FUNC_BULK_TXFER) { add_report(urb); if (check_and_update_report(urb)) display_report(urb); } } }
/* * Prepare a report. type is either INTERVAL or FINAL */ static void report_flow(struct _flow* flow, int type) { DEBUG_MSG(LOG_DEBUG, "report_flow called for flow %d (type %d)", flow->id, type); struct _report* report = (struct _report*)malloc(sizeof(struct _report)); report->id = flow->id; report->type = type; if (type == INTERVAL) report->begin = flow->last_report_time; else report->begin = flow->first_report_time; gettime(&report->end); flow->last_report_time = report->end; /* abort if we were scheduled way to early for a interval report */ if (time_diff(&report->begin,&report->end) < 0.2 * flow->settings.reporting_interval && type == INTERVAL){ free(report); return; } report->bytes_read = flow->statistics[type].bytes_read; report->bytes_written = flow->statistics[type].bytes_written; report->request_blocks_read = flow->statistics[type].request_blocks_read; report->response_blocks_read = flow->statistics[type].response_blocks_read; report->request_blocks_written = flow->statistics[type].request_blocks_written; report->response_blocks_written = flow->statistics[type].response_blocks_written; report->rtt_min = flow->statistics[type].rtt_min; report->rtt_max = flow->statistics[type].rtt_max; report->rtt_sum = flow->statistics[type].rtt_sum; report->iat_min = flow->statistics[type].iat_min; report->iat_max = flow->statistics[type].iat_max; report->iat_sum = flow->statistics[type].iat_sum; report->delay_min = flow->statistics[type].delay_min; report->delay_max = flow->statistics[type].delay_max; report->delay_sum = flow->statistics[type].delay_sum; /* Currently this will only contain useful information on Linux * and FreeBSD */ report->tcp_info = flow->statistics[type].tcp_info; if (flow->fd != -1) { /* Get latest MTU */ flow->pmtu = get_pmtu(flow->fd); report->pmtu = flow->pmtu; if (type == FINAL) report->imtu = get_imtu(flow->fd); else report->imtu = 0; } else { report->imtu = 0; report->pmtu = 0; } /* Add status flags to report */ report->status = 0; if (flow->statistics[type].bytes_read == 0) { if (flow_in_delay(&report->end, flow, READ)) report->status |= 'd'; else if (flow_sending(&report->end, flow, READ)) report->status |= 'l'; else if (flow->settings.duration[READ] == 0) report->status |= 'o'; else report->status |= 'f'; } else { if (!flow_sending(&report->end, flow, READ) && !flow->finished) report->status |= 'c'; else report->status |= 'n'; } report->status <<= 8; if (flow->statistics[type].bytes_written == 0) { if (flow_in_delay(&report->end, flow, WRITE)) report->status |= 'd'; else if (flow_sending(&report->end, flow, WRITE)) report->status |= 'l'; else if (flow->settings.duration[WRITE] == 0) report->status |= 'o'; else report->status |= 'f'; } else { if (!flow_sending(&report->end, flow, WRITE) && !flow->finished) report->status |= 'c'; else report->status |= 'n'; } /* New report interval, reset old data */ if (type == INTERVAL) { flow->statistics[INTERVAL].bytes_read = 0; flow->statistics[INTERVAL].bytes_written = 0; flow->statistics[INTERVAL].request_blocks_read = 0; flow->statistics[INTERVAL].response_blocks_read = 0; flow->statistics[INTERVAL].request_blocks_written = 0; flow->statistics[INTERVAL].response_blocks_written = 0; flow->statistics[INTERVAL].rtt_min = FLT_MAX; flow->statistics[INTERVAL].rtt_max = FLT_MIN; flow->statistics[INTERVAL].rtt_sum = 0.0F; flow->statistics[INTERVAL].iat_min = FLT_MAX; flow->statistics[INTERVAL].iat_max = FLT_MIN; flow->statistics[INTERVAL].iat_sum = 0.0F; flow->statistics[INTERVAL].delay_min = FLT_MAX; flow->statistics[INTERVAL].delay_max = FLT_MIN; flow->statistics[INTERVAL].delay_sum = 0.0F; } add_report(report); DEBUG_MSG(LOG_DEBUG, "report_flow finished for flow %d (type %d)", flow->id, type); }