void history_rotate() { hash_node_type* n = NULL; history_pos = (history_pos + 1) % HISTORY_LENGTH; hash_next_item(history, &n); while(n != NULL) { hash_node_type* next = n; history_type* d = (history_type*)n->rec; hash_next_item(history, &next); if(d->last_write == history_pos) { addr_pair key = *(addr_pair*)(n->key); hash_delete(history, &key); free(d); } else { d->recv[history_pos] = 0; d->sent[history_pos] = 0; } n = next; } history_totals.sent[history_pos] = 0; history_totals.recv[history_pos] = 0; if(history_len < HISTORY_LENGTH) { history_len++; } }
/* * Zeros all data in the screen hash, but does not remove items. */ void screen_hash_clear() { hash_node_type* n = NULL; while(hash_next_item(screen_hash, &n) == HASH_STATUS_OK) { host_pair_line* hpl = (host_pair_line*)n->rec; hpl->total_recv = hpl->total_sent = 0; memset(hpl->recv, 0, sizeof(hpl->recv)); memset(hpl->sent, 0, sizeof(hpl->sent)); } }
void make_screen_list() { hash_node_type* n = NULL; while(hash_next_item(screen_hash, &n) == HASH_STATUS_OK) { host_pair_line* line = (host_pair_line*)n->rec; int i; for(i = 0; i < HISTORY_DIVISIONS; i++) { line->recv[i] /= history_length(i); line->sent[i] /= history_length(i); } /* Don't make a new, sorted screen list if order is frozen */ if(!options.freezeorder) { sorted_list_insert(&screen_list, line); } } }
void analyse_data() { hash_node_type* n = NULL; if(options.paused == 1) { return; } // Zero totals memset(&totals, 0, sizeof totals); if(options.freezeorder) { screen_hash_clear(); } else { screen_list_clear(); hash_delete_all(screen_hash); } while(hash_next_item(history, &n) == HASH_STATUS_OK) { history_type* d = (history_type*)n->rec; host_pair_line* screen_line; union { host_pair_line **h_p_l_pp; void **void_pp; } u_screen_line = { &screen_line }; addr_pair ap; int i; int tsent, trecv; tsent = trecv = 0; ap = *(addr_pair*)n->key; /* Aggregate hosts, if required */ if(options.aggregate_src) { memset(&ap.src6, '\0', sizeof(ap.src6)); } if(options.aggregate_dest) { memset(&ap.dst6, '\0', sizeof(ap.dst6)); } /* Aggregate ports, if required */ if(options.showports == OPTION_PORTS_DEST || options.showports == OPTION_PORTS_OFF) { ap.src_port = 0; } if(options.showports == OPTION_PORTS_SRC || options.showports == OPTION_PORTS_OFF) { ap.dst_port = 0; } if(options.showports == OPTION_PORTS_OFF) { ap.protocol = 0; } if(hash_find(screen_hash, &ap, u_screen_line.void_pp) == HASH_STATUS_KEY_NOT_FOUND) { screen_line = xcalloc(1, sizeof *screen_line); hash_insert(screen_hash, &ap, screen_line); screen_line->ap = ap; } screen_line->total_sent += d->total_sent; screen_line->total_recv += d->total_recv; for(i = 0; i < HISTORY_LENGTH; i++) { int j; int ii = (HISTORY_LENGTH + history_pos - i) % HISTORY_LENGTH; for(j = 0; j < HISTORY_DIVISIONS; j++) { if(i < history_divs[j]) { screen_line->recv[j] += d->recv[ii]; screen_line->sent[j] += d->sent[ii]; } } } } make_screen_list(); calculate_totals(); }