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;
}