#include #include #include "marsio_io.h" #include "dumpfile_io.h" struct packet_io { enum packet_io_mode mode; struct marsio_io *marsio; struct dumpfile_io *dumpfile; }; struct packet_io *packet_io_new(struct packet_io_options *opts) { struct packet_io *packet_io = (struct packet_io *)calloc(1, sizeof(struct packet_io)); if (packet_io == NULL) { PACKET_IO_LOG_ERROR("unable to alloc packet io"); return NULL; } packet_io->mode = opts->mode; if (opts->mode == PACKET_IO_MARSIO) { packet_io->marsio = marsio_io_new(opts->app_symbol, opts->dev_symbol, opts->cpu_mask, opts->nr_threads); } else { packet_io->dumpfile = dumpfile_io_new(opts->dumpfile_dir, opts->nr_threads); } if (packet_io->marsio == NULL && packet_io->dumpfile == NULL) { goto error_out; } return packet_io; error_out: packet_io_free(packet_io); return NULL; } void packet_io_free(struct packet_io *packet_io) { if (packet_io) { if (packet_io->mode == PACKET_IO_MARSIO) { marsio_io_free(packet_io->marsio); } else { dumpfile_io_free(packet_io->dumpfile); } free(packet_io); packet_io = NULL; } } struct io_stat *packet_io_get_stat(struct packet_io *packet_io) { if (packet_io->mode == PACKET_IO_MARSIO) { return marsio_io_get_stat(packet_io->marsio); } else { return dumpfile_io_get_stat(packet_io->dumpfile); } } int packet_io_init(struct packet_io *packet_io, uint16_t thr_idx) { if (packet_io->mode == PACKET_IO_MARSIO) { return marsio_io_init(packet_io->marsio, thr_idx); } else { return dumpfile_io_init(packet_io->dumpfile, thr_idx); } } int packet_io_ingress(struct packet_io *packet_io, uint16_t thr_idx, struct packet *pkts, int nr_pkts) { if (packet_io->mode == PACKET_IO_MARSIO) { return marsio_io_ingress(packet_io->marsio, thr_idx, pkts, nr_pkts); } else { return dumpfile_io_ingress(packet_io->dumpfile, thr_idx, pkts, nr_pkts); } } void packet_io_egress(struct packet_io *packet_io, uint16_t thr_idx, struct packet *pkts, int nr_pkts) { if (packet_io->mode == PACKET_IO_MARSIO) { marsio_io_egress(packet_io->marsio, thr_idx, pkts, nr_pkts); } else { dumpfile_io_egress(packet_io->dumpfile, thr_idx, pkts, nr_pkts); } } void packet_io_drop(struct packet_io *packet_io, uint16_t thr_idx, struct packet *pkts, int nr_pkts) { if (packet_io->mode == PACKET_IO_MARSIO) { marsio_io_drop(packet_io->marsio, thr_idx, pkts, nr_pkts); } else { dumpfile_io_drop(packet_io->dumpfile, thr_idx, pkts, nr_pkts); } }