Netmap分析(三)

来源:互联网 发布:护腰带腰椎间盘 知乎 编辑:程序博客网 时间:2024/05/17 12:54

Netmap_linux.c

两个重要的结构

struct miscdevice netmap_cdevsw = { /* same name as FreeBSD */         MISC_DYNAMIC_MINOR,         "netmap",         &netmap_fops,};static struct file_operations netmap_fops = {     .owner = THIS_MODULE,     .open = linux_netmap_open,  //malloc the private_data from memory     .mmap = linux_netmap_mmap,   //设置netmap内存映射     LIN_IOCTL_NAME = linux_netmap_ioctl,     .poll = linux_netmap_poll,     .release = linux_netmap_release,};                                   

总控制函数

linux_netmap_ioctl(struct file *file, u_int cmd, u_long data /* arg */){        struct netmap_priv_d *priv = file->private_data;        int ret = 0;         union {                struct nm_ifreq ifr; /* truct nmreq就是netmap内核与用户空间的消息结构体。两者的互动就靠它了。*/                struct nmreq nmr;         } arg;         size_t argsize = 0;         switch (cmd) {        case NIOCTXSYNC:        case NIOCRXSYNC:                break;        case NIOCCONFIG:                argsize = sizeof(arg.ifr);                break;        default:                argsize = sizeof(arg.nmr);                break;        }            if (argsize) {                if (!data)                        return -EINVAL;                bzero(&arg, argsize);/*个人理解为将netmap_ring中的数据拷贝到kernel*/                if (copy_from_user(&arg, (void *)data, argsize) != 0)                        return -EFAULT;        }    //重要操作        ret = netmap_ioctl(priv, cmd, (caddr_t)&arg, NULL);/*个人理解为kernel将中的数据拷贝到netmap_ring*/        if (data && copy_to_user((void*)data, &arg, argsize) != 0)                return -EFAULT;        return -ret;}






0 0
原创粉丝点击