⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 libhpf.c

📁 我实现的一个基于零拷贝技术高速捕包的原型代码
💻 C
字号:
#include "defs.h"
#include "libhpf.h"

hpf_t * hpf_open(char *dev,char *ebuf)
{
    int fd;
    char *buff;
    kernel_addr_space_t *knl_mapped_addr;
    hpf_t *ret = (hpf_t *)malloc(sizeof(*ret));

    if(ret == NULL)
    {
        sprintf(ebuf,"No memory");
        goto fail;
    }

    fd = open(dev,O_RDWR);
    if(fd<0)
    {
        free(ret);
        sprintf(ebuf,"open dev file error : %s",strerror(errno));
        goto fail;
    }
    ret->fd = fd;

    buff = (char *)malloc((BUFF_SIZE+4096)*sizeof(char));
    if(buff == NULL)
    {
        sprintf(ebuf,"Fail to allocate user buff");
        goto fail;
    }
    ret->page_align_addr = PAGE_ALIGN(buff);
    ret->buff_addr = buff;
    memset(buff,0,BUFF_SIZE+4096);/*force os allocate enough physical pages*/

    if(ioctl(fd,KA_IOCINITBUF,ret->page_align_addr) < 0)
    {
        sprintf(ebuf,"ioctl device fail");
        goto fail;
    }
    ret->knl_mapped_addr = (kernel_addr_space_t*)mmap(NULL,sizeof(kernel_addr_space_t),PROT_READ|PROT_WRITE,MAP_SHARED,fd,0);
    ret->rx_q = &(knl_mapped_addr->rx_q);
    ret->free_q = &(knl_mapped_addr->free_q);

    return ret;

fail:
    free(ret);
    close(fd);
    free(buff);
    return NULL;


}

void hpf_close(hpf_t *p)
{
    if(p)
    {
        munmap(p->knl_mapped_addr,sizeof(kernel_addr_space_t));
        free(p->buff_addr);
        close(p->fd);
        free(p);
    }
}

char  *hpf_getpack(hpf_t *p)
{
    int rx_id;

    if(!p)
        return NULL;

    while((rx_id = dequeue(p->rx_q)) < 0)
        usleep(30);

    return (p->page_align_addr+(rx_id<<BLK_SIZE_SHIFT)) /*node index to virtual address translation*/

       }

void hpf_releasepack(hpf_t *p,char *addr)
{
	uint free_id;

	if(!p || !addr)
	   return;

	free_id = (addr-p->page_align_addr)>>BLK_SIZE_SHIFT;

	enqueue(p->free_q,free_id);/*queue never full*/

}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -