Refactored packet IO to use packet_manager_schedule_packet() instead of stellar_send_build_packet() to send user-built packets
This commit is contained in:
@@ -407,10 +407,15 @@ uint16_t pcap_io_ingress(void *handle, uint16_t thr_idx, struct packet *pkts, ui
|
||||
void pcap_io_egress(void *handle, uint16_t thr_idx, struct packet *pkts, uint16_t nr_pkts)
|
||||
{
|
||||
int len;
|
||||
struct tuple6 tuple;
|
||||
struct packet *pkt = NULL;
|
||||
struct pcap_io *pcap_io = (struct pcap_io *)handle;
|
||||
struct packet_io_stat *stat = &pcap_io->stat[thr_idx];
|
||||
|
||||
char file[PATH_MAX] = {0};
|
||||
char src_addr[INET6_ADDRSTRLEN] = {0};
|
||||
char dst_addr[INET6_ADDRSTRLEN] = {0};
|
||||
|
||||
for (uint16_t i = 0; i < nr_pkts; i++)
|
||||
{
|
||||
pkt = &pkts[i];
|
||||
@@ -419,15 +424,51 @@ void pcap_io_egress(void *handle, uint16_t thr_idx, struct packet *pkts, uint16_
|
||||
stat->pkts_tx++;
|
||||
stat->bytes_tx += len;
|
||||
|
||||
stat->raw_pkts_tx++;
|
||||
stat->raw_bytes_tx += len;
|
||||
if (packet_is_ctrl(pkt))
|
||||
{
|
||||
stat->ctrl_pkts_tx++;
|
||||
stat->ctrl_bytes_tx += len;
|
||||
}
|
||||
else
|
||||
{
|
||||
stat->raw_pkts_tx++;
|
||||
stat->raw_bytes_tx += len;
|
||||
}
|
||||
|
||||
struct pcap_pkt *pcap_pkt = (struct pcap_pkt *)packet_get_origin_ctx(pkt);
|
||||
if (pcap_pkt)
|
||||
{
|
||||
free(pcap_pkt);
|
||||
}
|
||||
packet_free(pkt);
|
||||
else
|
||||
{
|
||||
stat->pkts_injected++;
|
||||
stat->bytes_injected += len;
|
||||
|
||||
memset(&tuple, 0, sizeof(struct tuple6));
|
||||
packet_get_innermost_tuple6(pkt, &tuple);
|
||||
|
||||
if (tuple.addr_family == AF_INET)
|
||||
{
|
||||
inet_ntop(AF_INET, &tuple.src_addr.v4, src_addr, INET6_ADDRSTRLEN);
|
||||
inet_ntop(AF_INET, &tuple.dst_addr.v4, dst_addr, INET6_ADDRSTRLEN);
|
||||
}
|
||||
else
|
||||
{
|
||||
inet_ntop(AF_INET6, &tuple.src_addr.v6, src_addr, INET6_ADDRSTRLEN);
|
||||
inet_ntop(AF_INET6, &tuple.dst_addr.v6, dst_addr, INET6_ADDRSTRLEN);
|
||||
}
|
||||
snprintf(file, sizeof(file), "inject-%s:%u-%s:%u-%lu.pcap", src_addr, ntohs(tuple.src_port), dst_addr, ntohs(tuple.dst_port), stat->pkts_injected);
|
||||
|
||||
if (packet_dump_pcap(pkt, file) == -1)
|
||||
{
|
||||
PCAP_IO_LOG_ERROR("unable to dump pcap file: %s", file);
|
||||
}
|
||||
else
|
||||
{
|
||||
PCAP_IO_LOG_FATAL("dump inject packet: %s", file);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -451,61 +492,6 @@ void pcap_io_drop(void *handle, uint16_t thr_idx, struct packet *pkts, uint16_t
|
||||
}
|
||||
}
|
||||
|
||||
uint16_t pcap_io_inject(void *handle, uint16_t thr_idx, struct packet *pkts, uint16_t nr_pkts)
|
||||
{
|
||||
uint16_t len;
|
||||
struct tuple6 tuple;
|
||||
struct packet *pkt = NULL;
|
||||
struct pcap_io *pcap_io = (struct pcap_io *)handle;
|
||||
struct packet_io_stat *stat = &pcap_io->stat[thr_idx];
|
||||
|
||||
char file[PATH_MAX] = {0};
|
||||
char src_addr[INET6_ADDRSTRLEN] = {0};
|
||||
char dst_addr[INET6_ADDRSTRLEN] = {0};
|
||||
|
||||
for (uint16_t i = 0; i < nr_pkts; i++)
|
||||
{
|
||||
pkt = &pkts[i];
|
||||
len = packet_get_raw_len(pkt);
|
||||
|
||||
stat->pkts_injected++;
|
||||
stat->bytes_injected += len;
|
||||
|
||||
stat->raw_pkts_tx++;
|
||||
stat->raw_bytes_tx += len;
|
||||
|
||||
stat->pkts_tx++;
|
||||
stat->bytes_tx += len;
|
||||
|
||||
memset(&tuple, 0, sizeof(struct tuple6));
|
||||
packet_get_innermost_tuple6(pkt, &tuple);
|
||||
|
||||
if (tuple.addr_family == AF_INET)
|
||||
{
|
||||
inet_ntop(AF_INET, &tuple.src_addr.v4, src_addr, INET6_ADDRSTRLEN);
|
||||
inet_ntop(AF_INET, &tuple.dst_addr.v4, dst_addr, INET6_ADDRSTRLEN);
|
||||
}
|
||||
else
|
||||
{
|
||||
inet_ntop(AF_INET6, &tuple.src_addr.v6, src_addr, INET6_ADDRSTRLEN);
|
||||
inet_ntop(AF_INET6, &tuple.dst_addr.v6, dst_addr, INET6_ADDRSTRLEN);
|
||||
}
|
||||
snprintf(file, sizeof(file), "inject-%s:%u-%s:%u-%lu.pcap", src_addr, ntohs(tuple.src_port), dst_addr, ntohs(tuple.dst_port), stat->pkts_injected);
|
||||
|
||||
if (packet_dump_pcap(pkt, file) == -1)
|
||||
{
|
||||
PCAP_IO_LOG_ERROR("unable to dump pcap file: %s", file);
|
||||
}
|
||||
else
|
||||
{
|
||||
PCAP_IO_LOG_FATAL("dump inject packet: %s", file);
|
||||
}
|
||||
packet_free(pkt);
|
||||
}
|
||||
|
||||
return nr_pkts;
|
||||
}
|
||||
|
||||
void pcap_io_yield(void *handle __attribute__((unused)), uint16_t thr_idx __attribute__((unused)))
|
||||
{
|
||||
return;
|
||||
|
||||
Reference in New Issue
Block a user