Esta biblioteca está diseñada para generar archivos y leer el formato PCAP. También se admite la generación de paquetes UDP.
Funciones:
La función crea un archivo y devuelve NULL en caso de error o un puntero a PCAPFILE
Función para completar un archivo creado a través de lpcap_create, devuelve 0 en caso de error. En la entrada ella recibe:
Función de cierre de fichero. Recibe como entrada:
La función de generar un paquete de datos ethernet-ip-udp ethernet_data_t basado en datos de network_packet_frame_t recibe como entrada:
Función de apertura de archivos. Si el archivo no contiene signos de formato PCAP, se devuelve 0, como en otras situaciones de error.
Función para leer el encabezado de un archivo desde un descriptor PCAPFILE * pfl de un archivo ya abierto en pcap_hdr_t * phdr phdr debe apuntar a un área de memoria existente. Devuelve 0 en caso de error
Función para leer un marco de datos de archivo desde un identificador PCAPFILE * pfl de un archivo ya abierto en pcaprec_hdr_and_data_t * phdr phdr debe apuntar a un área de memoria existente. Devuelve 0 en caso de error
Función para mover el puntero de posición al número de fotograma (es decir, registro) record_num.
Ejemplo de uso con generación de paquetes simple
int i=0;
const int PKTS_COUNT = 212000;
int PKTS_LEN = 540;
static ethernet_data_t eda;
eda.len = PKTS_LEN;
PCAPFILE * pfl = lpcap_create("./pcaplibtestfile.pcap");
for( i=0;i< PKTS_COUNT;i++ )
{
/* TODO: fill data memcpy(eda.data , YOUR_DATA_BUF,SIZE_YOUR_DATA_BUF );
eda.len = SIZE_YOUR_DATA_BUF;
*/
lpcap_write_data( pfl , &eda , i, 0 );
}
lpcap_close_file( pfl );
Ejemplo de generación de paquetes UDP
#include "pcap_file_generator.h"
#include "ethernet.h"
.......
int i=0;
const int PKTS_COUNT = 2000100;
const int udp_data_sz = 1440;// udp data size
ethernet_data_t eda;
eda.len = udp_data_sz +(sizeof(eth_frame_t)+sizeof(ip_packet_t))+8;//34 - headers len
uint8_t eth_data[eda.len];
eth_frame_t * eth_f = (eth_frame_t *) eth_data;
network_packet_frame_t npf;
uint8_t m_addr[] = {0xef,0xab,0x03, 0xdc,0xee,0x11};
memcpy(npf.dst_mac ,m_addr , sizeof(m_addr));
//change mac
m_addr[4] = 0x44;
m_addr[5] = 0x88;
memcpy(npf.src_mac ,m_addr , sizeof(m_addr));
npf.src_port = 4567;
npf.dst_port = 4568;
strcpy(npf.src_ip, "192.168.23.100");
strcpy(npf.dst_ip, "192.168.22.105");
uint8_t tdata[ udp_data_sz ];
npf.data = tdata;
npf.data_len = sizeof(tdata);
build_udp_frame(eth_f , &npf ); // convert network_packet_frame_t to eth_frame_t
eda.data = (void *) eth_f;
PCAPFILE * pfl = lpcap_create("./pcaplibtestfile.pcap");
for( i=0;i< PKTS_COUNT;i++ )
{
lpcap_write_data( pfl , &eda , i, 0 );
}
lpcap_close_file( pfl );
Ejemplo de lectura de paquetes desde un archivo.
PCAPFILE * pfr = lpcap_open("./pcaplibtestfile.pcap");
pcap_hdr_t phdr;
if( lpcap_read_header( pfr, &phdr ))
{
int rese_rec_read = 0 ;
pcaprec_hdr_and_data_t p_rec_data;
do{
rese_rec_read = lpcap_read_frame_record( pfr , &p_rec_data);
}while(rese_rec_read>0);