我用的是4。有一个内核模块,当我打开一个套接字时,我接收套接字信息。
if ((fd = socket(sai.sin_family, skt_type, skt_protocol)) < 0)
// ...
在这种情况下,我正在使用UDP,在我使用sendto()
传输我的第一个数据之前,我希望能够从我的客户端程序传递数据结构到我的内核模块。然后,我可以在协议中添加额外的信息,并将这些数据与文件描述符关联起来。这不是用户数据,相反,它旨在控制我的协议如何运行。
我想传入并关联到套接字的数据结构如下所示:
struct some_tag_info_t {
int field_t;
char field_a[MAX_A];
void *field_b;
};
我有一种感觉,ioctl可能会为我做一些事情,因为它似乎能够用文件描述符操作底层设备参数。
在net/socket.c
中,ioctl()
为:
static long sock_ioctl(struct file *file, unsigned cmd, unsigned long arg)
在函数之后,我看到了这个注释。
/*
* With an ioctl, arg may well be a user mode pointer, but we don't know
* what to do with it - that's up to the protocol still.
*/
似乎我可以使用arg
在我的struct some_tag_info_t
上面传递?有人能对此发表评论吗?任何想法吗?
您的理解是正确的,您可以从用户空间传递任何东西到ioctl()
处理程序,然后由内核模块正确处理您传递的任何命令和参数。但是,由于您正在使用套接字并编写自己的协议,因此通过getsockopt(2)
/setsockopt(2)
实现此功能更为合适。setsockopt(2)
的参数可以是任何您想要的。在用户空间中,您可以这样做:
res = setsockopt(sock_fd, &your_struct, sizeof(your_struct));