/* ********************************************************************************************** * File: pcap_file.h * Description: pcap file runmode api * Authors: Liu WenTan * Date: 2022-07-15 * Copyright: (c) 2018-2022 Geedge Networks, Inc. All rights reserved. *********************************************************************************************** */ #ifndef _PIO_PCAP_FILE_H_ #define _PIO_PCAP_FILE_H_ #ifdef __cpluscplus extern "C" { #endif #include #include #include #include #include "packet_io_util.h" struct pio_pcap_file_instance_context { }; struct pending_file { char file_name[NAME_MAX]; struct timespec modified_time; TAILQ_ENTRY(pending_file) next; }; struct safe_pending_file_queue { TAILQ_HEAD(pending_file_queue, pending_file) file_queue_head; uint32_t file_queue_len; pthread_mutex_t queue_mutex; }; struct pcap_file_shared_info { /* bpf filter string, such as "tcp and port 25"*/ char bpf_string[STR_MAX_LEN]; /* if delete when pcapfile is processed */ int should_delete; /* counters */ uint64_t pkts; uint64_t bytes; uint64_t files; /* processing completed flags */ uint8_t done; }; struct pcap_plain_file_info { char file_name[NAME_MAX]; pcap_t *pcap_handle; pthread_mutex_t handle_mutex; int data_link; struct bpf_program filter; struct pcap_file_shared_info *shared; }; struct pcap_file_directory_info { char dir_name[NAME_MAX]; DIR *directory; struct pcap_plain_file_info *current_file[VIRTUAL_QUEUE_MAX_NUM]; time_t delay; struct pcap_file_shared_info *shared; struct pending_file *pending_file[VIRTUAL_QUEUE_MAX_NUM]; }; /** * @brief pio_pcap_file_device_context - pcap file device context */ struct pio_pcap_file_device_context { union { struct pcap_file_directory_info *dir; struct pcap_plain_file_info *file; } entity; bool is_dir; /* rx pio packet queue */ struct pio_packet_queue pkt_queues[VIRTUAL_QUEUE_MAX_NUM]; struct pcap_file_shared_info shared; /* point to packet_io device it belongs to */ struct packet_io_device *pdev; pthread_mutex_t ctx_mutex; }; /** * @brief * * @param pinst * @return int */ ssize_t pio_pcap_file_instance_create(struct packet_io_instance *pinst); /** * @brief * * @param pinst */ void pio_pcap_file_instance_destroy(struct packet_io_instance *pinst); /** * @brief open pcap_file device * * @param pdev: pcap_file device's pointer which support following params * pdev->dev_name: the name of pcap file * pdev->rxq_num: number of the packet receiving queues for the device * pdev->txq_num: number of the packet sending queues for the device */ ssize_t pio_pcap_file_device_open(struct packet_io_device *pdev); /** * @brief close pcap_live device */ ssize_t pio_pcap_file_device_close(struct packet_io_device *pdev); ssize_t pio_pcap_file_device_receive(struct packet_io_device *pdev, uint32_t rxq_id, struct stellar_packet **pkts, size_t nr_pkts); void pio_pcap_file_device_pkt_free(struct packet_io_device *pdev, uint32_t qid, struct stellar_packet **pkts, size_t nr_pkts); char *pio_pcap_file_device_buff_ctrlzone(struct stellar_packet *p, size_t *ctrlzone_len); char *pio_pcap_file_device_buff_mtod(struct stellar_packet *p, size_t *data_len); #ifdef __cpluscplus } #endif #endif /* _PIO_PCAP_FILE_H_ */