int frame_pfring(pfring *pd, struct frame_buf *f){ fbuf = f; pfcount = 0; packet_direction direction = rx_and_tx_direction; int rc; pfring_set_direction(pd, direction); if((rc = pfring_set_socket_mode(pd, recv_only_mode)) != 0) fprintf(stderr, "pfring_set_socket_mode returned [rc=%d]\n", rc); pfring_set_application_stats(pd, "statistics not yet computed, please try again...\n"); if(pfring_enable_ring(pd) != 0){ fprintf(stderr, "unable to enable ring\n"); pfring_close(pd); return -1; } printf("capture start...\n"); pfring_loop(pd, pf_dummy_packet, (u_char *)NULL, 1); pfring_close(pd); return 0; }
void print_stats() { pfring_stat pfringStat; struct timeval endTime; double deltaMillisec; static u_int8_t print_all; static u_int64_t lastPkts = 0; static u_int64_t lastBytes = 0; double diff, bytesDiff; static struct timeval lastTime; char buf[256], buf1[64], buf2[64], buf3[64], timebuf[128]; u_int64_t deltaMillisecStart; if(startTime.tv_sec == 0) { gettimeofday(&startTime, NULL); print_all = 0; } else print_all = 1; gettimeofday(&endTime, NULL); deltaMillisec = delta_time(&endTime, &startTime); if(pfring_stats(pd, &pfringStat) >= 0) { double thpt; int i; unsigned long long nBytes = 0, nPkts = 0, nMatches = 0; for(i=0; i < num_threads; i++) { nBytes += stats->numBytes[i]; nPkts += stats->numPkts[i]; nMatches += stats->numStringMatches[i]; } deltaMillisecStart = delta_time(&endTime, &startTime); snprintf(buf, sizeof(buf), "Duration: %s\n" "Packets: %lu\n" "Dropped: %lu\n" "Bytes: %lu\n", msec2dhmsm(deltaMillisecStart, timebuf, sizeof(timebuf)), (long unsigned int) pfringStat.recv, (long unsigned int) pfringStat.drop, (long unsigned int) nBytes); pfring_set_application_stats(pd, buf); thpt = ((double)8*nBytes)/(deltaMillisec*1000); fprintf(stderr, "=========================\n" "Absolute Stats: [%u pkts rcvd]" "[%u pkts dropped]\n" "Total Pkts=%u/Dropped=%.1f %%\n", (unsigned int)pfringStat.recv, (unsigned int)pfringStat.drop, (unsigned int)(pfringStat.recv+pfringStat.drop), pfringStat.drop == 0 ? 0 : (double)(pfringStat.drop*100)/(double)(pfringStat.recv+pfringStat.drop)); fprintf(stderr, "%s pkts - %s bytes", pfring_format_numbers((double)nPkts, buf1, sizeof(buf1), 0), pfring_format_numbers((double)nBytes, buf2, sizeof(buf2), 0)); if(print_all) fprintf(stderr, " [%s pkt/sec - %s Mbit/sec]\n", pfring_format_numbers((double)(nPkts*1000)/deltaMillisec, buf1, sizeof(buf1), 1), pfring_format_numbers(thpt, buf2, sizeof(buf2), 1)); else fprintf(stderr, "\n"); if(automa != NULL) fprintf(stderr, "String matched: %llu\n", nMatches); if(print_all && (lastTime.tv_sec > 0)) { deltaMillisec = delta_time(&endTime, &lastTime); diff = nPkts-lastPkts; bytesDiff = nBytes - lastBytes; bytesDiff /= (1000*1000*1000)/8; snprintf(buf, sizeof(buf), "Actual Stats: %llu pkts [%s ms][%s pps/%s Gbps]", (long long unsigned int)diff, pfring_format_numbers(deltaMillisec, buf1, sizeof(buf1), 1), pfring_format_numbers(((double)diff/(double)(deltaMillisec/1000)), buf2, sizeof(buf2), 1), pfring_format_numbers(((double)bytesDiff/(double)(deltaMillisec/1000)), buf3, sizeof(buf3), 1)); fprintf(stderr, "=========================\n%s\n", buf); } lastPkts = nPkts, lastBytes = nBytes; } lastTime.tv_sec = endTime.tv_sec, lastTime.tv_usec = endTime.tv_usec; fprintf(stderr, "=========================\n\n"); }