Use new pcap io to dump & write out packets from input pcap file.
Signed-off-by: Vadim Kochan <[email protected]>
---
netsniff-ng.c | 127 +++++++++++++++++----------------------------------
netsniff-ng/Makefile | 1 +
2 files changed, 44 insertions(+), 84 deletions(-)
diff --git a/netsniff-ng.c b/netsniff-ng.c
index bbffe72..a0ede4e 100644
--- a/netsniff-ng.c
+++ b/netsniff-ng.c
@@ -616,49 +616,26 @@ static void translate_pcap_to_txf(int fdo, uint8_t *out,
size_t len)
static void read_pcap(struct ctx *ctx)
{
- uint8_t *out;
- int ret, fd, fdo = 0;
- unsigned long trunced = 0;
- size_t out_len;
- pcap_pkthdr_t phdr;
+ int ret, fdo = 0;
struct sock_fprog bpf_ops;
struct frame_map fm;
struct timeval start, end, diff;
bool is_out_pcap = ctx->device_out && strstr(ctx->device_out, ".pcap");
- const struct pcap_file_ops *pcap_out_ops = pcap_ops[PCAP_OPS_RW];
+ struct pcap_io pcap_out;
+ struct pcap_io pcap_in;
+ struct pcap_packet *pkt;
bug_on(!__pcap_io);
- if (!strncmp("-", ctx->device_in, strlen("-"))) {
- fd = dup_or_die(fileno(stdin));
- close(fileno(stdin));
- if (ctx->pcap == PCAP_OPS_MM)
- ctx->pcap = PCAP_OPS_SG;
- } else {
- /* O_NOATIME requires privileges, in case we don't have
- * them, retry without them at a minor cost of updating
- * atime in case the fs has been mounted as such.
- */
- fd = open(ctx->device_in, O_RDONLY | O_LARGEFILE | O_NOATIME);
- if (fd < 0 && errno == EPERM)
- fd = open_or_die(ctx->device_in, O_RDONLY |
O_LARGEFILE);
- if (fd < 0)
- panic("Cannot open file %s! %s.\n", ctx->device_in,
- strerror(errno));
- }
-
- if (__pcap_io->init_once_pcap)
- __pcap_io->init_once_pcap(false);
+ pcap_io_init(&pcap_in, ctx->pcap);
+ pcap_io_enforce_prio_set(&pcap_in, ctx->enforce);
+ pcap_io_open(&pcap_in, ctx->device_in, PCAP_MODE_RD);
+ pcap_io_header_read(&pcap_in);
- ret = __pcap_io->pull_fhdr_pcap(fd, &ctx->magic, &ctx->link_type);
- if (ret)
- panic("Error reading pcap header!\n");
+ pkt = pcap_packet_alloc(&pcap_in);
+ pcap_packet_buf_alloc(pkt, round_up(1024 * 1024, RUNTIME_PAGE_SIZE));
- if (__pcap_io->prepare_access_pcap) {
- ret = __pcap_io->prepare_access_pcap(fd, PCAP_MODE_RD,
ctx->jumbo);
- if (ret)
- panic("Error prepare reading pcap!\n");
- }
+ ctx->link_type = pcap_io_link_type_get(&pcap_in);
fmemset(&fm, 0, sizeof(fm));
@@ -666,28 +643,25 @@ static void read_pcap(struct ctx *ctx)
if (ctx->dump_bpf)
bpf_dump_all(&bpf_ops);
- dissector_init_all(ctx->print_mode);
+ pcap_io_bpf_apply(&pcap_in, &bpf_ops);
- out_len = round_up(1024 * 1024, RUNTIME_PAGE_SIZE);
- out = xmalloc_aligned(out_len, CO_CACHE_LINE_SIZE);
+ dissector_init_all(ctx->print_mode);
if (ctx->device_out) {
if (!strncmp("-", ctx->device_out, strlen("-"))) {
fdo = dup_or_die(fileno(stdout));
close(fileno(stdout));
- } else {
- fdo = open_or_die_m(ctx->device_out, O_RDWR | O_CREAT |
- O_TRUNC | O_LARGEFILE, DEFFILEMODE);
+ } else if (is_out_pcap) {
+ pcap_io_init(&pcap_out, PCAP_OPS_RW);
+ pcap_io_open(&pcap_out, ctx->device_out, PCAP_MODE_WR);
+
+ pcap_io_header_copy(&pcap_out, &pcap_in);
+ ret = pcap_io_header_write(&pcap_out);
+ if (ret)
+ panic("Error writing pcap header!\n");
}
}
- if (is_out_pcap) {
- ret = pcap_out_ops->push_fhdr_pcap(fdo, ctx->magic,
- ctx->link_type);
- if (ret)
- panic("Error writing pcap header!\n");
- }
-
drop_privileges(ctx->enforce, ctx->uid, ctx->gid);
printf("Running! Hang up with ^C!\n\n");
@@ -696,46 +670,34 @@ static void read_pcap(struct ctx *ctx)
bug_on(gettimeofday(&start, NULL));
while (likely(sigint == 0)) {
- do {
- ret = __pcap_io->read_pcap(fd, &phdr, ctx->magic,
- out, out_len);
- if (unlikely(ret < 0))
- goto out;
+ uint8_t *pkt_buf;
- if (unlikely(pcap_get_length(&phdr, ctx->magic) == 0)) {
- trunced++;
- continue;
- }
-
- if (unlikely(pcap_get_length(&phdr, ctx->magic) >
out_len)) {
- pcap_set_length(&phdr, ctx->magic, out_len);
- trunced++;
- }
- } while (ctx->filter &&
- !bpf_run_filter(&bpf_ops, out,
- pcap_get_length(&phdr, ctx->magic)));
+ ret = pcap_io_packet_read(&pcap_in, pkt);
+ if (unlikely(!ret)) {
+ goto out;
+ }
- pcap_pkthdr_to_tpacket_hdr(&phdr, ctx->magic, &fm.tp_h,
&fm.s_ll);
+ pcap_packet_to_tpacket2(pkt, &fm.tp_h, &fm.s_ll);
ctx->tx_bytes += fm.tp_h.tp_len;
ctx->tx_packets++;
- show_frame_hdr(out, fm.tp_h.tp_snaplen, ctx->link_type, &fm,
+ pkt_buf = pcap_packet_buf_get(pkt);
+
+ show_frame_hdr(pkt_buf, fm.tp_h.tp_snaplen, ctx->link_type, &fm,
ctx->print_mode, ctx->tx_packets);
- dissector_entry_point(out, fm.tp_h.tp_snaplen,
+ dissector_entry_point(pkt_buf, fm.tp_h.tp_snaplen,
ctx->link_type, ctx->print_mode,
&fm.s_ll);
if (is_out_pcap) {
- size_t pcap_len = pcap_get_length(&phdr, ctx->magic);
- int wlen = pcap_out_ops->write_pcap(fdo, &phdr,
- ctx->magic, out,
- pcap_len);
- if (unlikely(wlen != (int)pcap_get_total_length(&phdr,
ctx->magic)))
+ ret = pcap_io_packet_write(&pcap_out, pkt);
+ if (unlikely(ret))
panic("Error writing to pcap!\n");
+
} else if (ctx->device_out) {
- translate_pcap_to_txf(fdo, out, fm.tp_h.tp_snaplen);
+ translate_pcap_to_txf(fdo, pkt_buf, fm.tp_h.tp_snaplen);
}
if (frame_count_max != 0) {
@@ -754,26 +716,23 @@ out:
dissector_cleanup_all();
- if (__pcap_io->prepare_close_pcap)
- __pcap_io->prepare_close_pcap(fd, PCAP_MODE_RD);
-
- xfree(out);
+ pcap_io_close(&pcap_in);
+ pcap_packet_free(pkt);
fflush(stdout);
printf("\n");
printf("\r%12lu packets outgoing\n", ctx->tx_packets);
- printf("\r%12lu packets truncated in file\n", trunced);
+ printf("\r%12lu packets truncated in file\n",
pcap_io_truncated_get(&pcap_in));
printf("\r%12lu bytes outgoing\n", ctx->tx_bytes);
printf("\r%12lu sec, %lu usec in total\n", diff.tv_sec, diff.tv_usec);
- if (!strncmp("-", ctx->device_in, strlen("-")))
- dup2(fd, fileno(stdin));
- close(fd);
-
if (ctx->device_out) {
- if (!strncmp("-", ctx->device_out, strlen("-")))
+ if (is_out_pcap) {
+ pcap_io_close(&pcap_out);
+ } else if (!strncmp("-", ctx->device_out, strlen("-"))) {
dup2(fdo, fileno(stdout));
- close(fdo);
+ close(fdo);
+ }
}
}
diff --git a/netsniff-ng/Makefile b/netsniff-ng/Makefile
index d1d8a85..f47189d 100644
--- a/netsniff-ng/Makefile
+++ b/netsniff-ng/Makefile
@@ -59,6 +59,7 @@ netsniff-ng-objs = dissector.o \
pcap_rw.o \
pcap_sg.o \
pcap_mm.o \
+ pcap_io.o \
ring_rx.o \
ring_tx.o \
ring.o \
--
2.10.2
--
You received this message because you are subscribed to the Google Groups
"netsniff-ng" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
For more options, visit https://groups.google.com/d/optout.