Allow writing ISB with given recv/drop counters.

No functional change by this commit.

svn path=/trunk/; revision=42242
This commit is contained in:
Michael Tüxen 2012-04-25 20:50:38 +00:00
parent 1cd8ca08a6
commit 8ea1984ddc
3 changed files with 28 additions and 23 deletions

View File

@ -2749,13 +2749,24 @@ capture_loop_close_output(capture_options *capture_opts, loop_data *ld, int *err
for (i = 0; i < global_ld.pcaps->len; i++) { for (i = 0; i < global_ld.pcaps->len; i++) {
pcap_opts = g_array_index(global_ld.pcaps, pcap_options *, i); pcap_opts = g_array_index(global_ld.pcaps, pcap_options *, i);
if (!pcap_opts->from_cap_pipe) { if (!pcap_opts->from_cap_pipe) {
guint64 isb_ifrecv, isb_ifdrop;
struct pcap_stat stats;
if (pcap_stats(pcap_opts->pcap_h, &stats) >= 0) {
isb_ifrecv = stats.ps_recv;
isb_ifdrop = stats.ps_drop;
} else {
isb_ifrecv = G_MAXUINT64;
isb_ifdrop = G_MAXUINT64;
}
libpcap_write_interface_statistics_block(ld->pdh, libpcap_write_interface_statistics_block(ld->pdh,
i, i,
pcap_opts->pcap_h,
&ld->bytes_written, &ld->bytes_written,
"Counters provided by libpcap", "Counters provided by libpcap",
start_time, start_time,
end_time, end_time,
isb_ifrecv,
isb_ifdrop,
err_close); err_close);
} }
} }

View File

@ -588,11 +588,12 @@ libpcap_write_enhanced_packet_block(FILE *fp,
gboolean gboolean
libpcap_write_interface_statistics_block(FILE *fp, libpcap_write_interface_statistics_block(FILE *fp,
guint32 interface_id, guint32 interface_id,
pcap_t *pd,
long *bytes_written, long *bytes_written,
const char *comment, /* OPT_COMMENT 1 */ const char *comment, /* OPT_COMMENT 1 */
guint64 isb_starttime, /* ISB_STARTTIME 2 */ guint64 isb_starttime, /* ISB_STARTTIME 2 */
guint64 isb_endtime, /* ISB_ENDTIME 3 */ guint64 isb_endtime, /* ISB_ENDTIME 3 */
guint64 isb_ifrecv, /* ISB_IFRECV 4 */
guint64 isb_ifdrop, /* ISB_IFDROP 5 */
int *err) int *err)
{ {
struct isb isb; struct isb isb;
@ -602,11 +603,8 @@ libpcap_write_interface_statistics_block(FILE *fp,
struct timeval now; struct timeval now;
#endif #endif
struct option option; struct option option;
struct pcap_stat stats;
guint32 block_total_length; guint32 block_total_length;
guint64 timestamp; guint64 timestamp;
guint64 counter;
gboolean stats_retrieved;
gboolean have_options = FALSE; gboolean have_options = FALSE;
const guint32 padding = 0; const guint32 padding = 0;
#ifdef _WIN32 #ifdef _WIN32
@ -648,17 +646,14 @@ libpcap_write_interface_statistics_block(FILE *fp,
timestamp = (guint64)(now.tv_sec) * 1000000 + timestamp = (guint64)(now.tv_sec) * 1000000 +
(guint64)(now.tv_usec); (guint64)(now.tv_usec);
#endif #endif
if (pcap_stats(pd, &stats) < 0) { block_total_length = sizeof(struct isb) + sizeof(guint32);
stats_retrieved = FALSE; if (isb_ifrecv != G_MAXUINT64) {
g_warning("pcap_stats() failed."); block_total_length += sizeof(struct option) + sizeof(guint64);
} else { have_options = TRUE;
stats_retrieved = TRUE;
have_options = TRUE;
} }
block_total_length = sizeof(struct isb) + if (isb_ifdrop != G_MAXUINT64) {
sizeof(guint32); block_total_length += sizeof(struct option) + sizeof(guint64);
if (stats_retrieved) { have_options = TRUE;
block_total_length += 2 * sizeof(struct option) + 2 * sizeof(guint64); /* ISB_IFRECV + ISB_IFDROP */
} }
/* OPT_COMMENT */ /* OPT_COMMENT */
if ((comment != NULL) && (strlen(comment) > 0) && (strlen(comment) < G_MAXUINT16)) { if ((comment != NULL) && (strlen(comment) > 0) && (strlen(comment) < G_MAXUINT16)) {
@ -719,19 +714,17 @@ libpcap_write_interface_statistics_block(FILE *fp,
WRITE_DATA(fp, &high, sizeof(guint32), *bytes_written, err); WRITE_DATA(fp, &high, sizeof(guint32), *bytes_written, err);
WRITE_DATA(fp, &low, sizeof(guint32), *bytes_written, err); WRITE_DATA(fp, &low, sizeof(guint32), *bytes_written, err);
} }
if (stats_retrieved) { if (isb_ifrecv != G_MAXUINT64) {
/* */
option.type = ISB_IFRECV; option.type = ISB_IFRECV;
option.value_length = sizeof(guint64); option.value_length = sizeof(guint64);
counter = stats.ps_recv;
WRITE_DATA(fp, &option, sizeof(struct option), *bytes_written, err); WRITE_DATA(fp, &option, sizeof(struct option), *bytes_written, err);
WRITE_DATA(fp, &counter, sizeof(guint64), *bytes_written, err); WRITE_DATA(fp, &isb_ifrecv, sizeof(guint64), *bytes_written, err);
/* */ }
if (isb_ifdrop != G_MAXUINT64) {
option.type = ISB_IFDROP; option.type = ISB_IFDROP;
option.value_length = sizeof(guint64); option.value_length = sizeof(guint64);
counter = stats.ps_drop;
WRITE_DATA(fp, &option, sizeof(struct option), *bytes_written, err); WRITE_DATA(fp, &option, sizeof(struct option), *bytes_written, err);
WRITE_DATA(fp, &counter, sizeof(guint64), *bytes_written, err); WRITE_DATA(fp, &isb_ifdrop, sizeof(guint64), *bytes_written, err);
} }
if (have_options) { if (have_options) {
/* write end of options */ /* write end of options */

View File

@ -79,11 +79,12 @@ libpcap_write_interface_description_block(FILE *fp,
extern gboolean extern gboolean
libpcap_write_interface_statistics_block(FILE *fp, libpcap_write_interface_statistics_block(FILE *fp,
guint32 interface_id, guint32 interface_id,
pcap_t *pd,
long *bytes_written, long *bytes_written,
const char *comment, /* OPT_COMMENT 1 */ const char *comment, /* OPT_COMMENT 1 */
guint64 isb_starttime, /* ISB_STARTTIME 2 */ guint64 isb_starttime, /* ISB_STARTTIME 2 */
guint64 isb_endtime, /* ISB_ENDTIME 3 */ guint64 isb_endtime, /* ISB_ENDTIME 3 */
guint64 isb_ifrecv, /* ISB_IFRECV 4 */
guint64 isb_ifdrop, /* ISB_IFDROP 5 */
int *err); int *err);
extern gboolean extern gboolean