C 我需要叫一个插座;setopt";来自内核空间的例程

C 我需要叫一个插座;setopt";来自内核空间的例程,c,linux,sockets,tcp,linux-kernel,C,Linux,Sockets,Tcp,Linux Kernel,我需要从内核空间对TCP套接字进行更改(尽管我希望它是通用的)。USB驱动程序将收到一条消息,需要对给定的套接字结构进行此更改 直接调用函数需要用户空间内存,我无法在生产环境中使用这些解决方法。因此,直截了当的呼吁似乎不太可能。我看到的另一个解决方案是复制期望用户空间内存的部分,但是这个解决方案也不是我想要投入生产的 我正在考虑编写一个用户空间程序,通过procfs与驱动程序对话并进行调用。驱动程序会将数据放入文件中,以指示用户空间应用程序执行各种操作 有没有更好的方法来实现这一点 根据选项的不

我需要从内核空间对TCP套接字进行更改(尽管我希望它是通用的)。USB驱动程序将收到一条消息,需要对给定的
套接字
结构进行此更改

直接调用函数需要用户空间内存,我无法在生产环境中使用这些解决方法。因此,直截了当的呼吁似乎不太可能。我看到的另一个解决方案是复制期望用户空间内存的部分,但是这个解决方案也不是我想要投入生产的

我正在考虑编写一个用户空间程序,通过procfs与驱动程序对话并进行调用。驱动程序会将数据放入文件中,以指示用户空间应用程序执行各种操作


有没有更好的方法来实现这一点

根据选项的不同,您可以在内核空间内调用或。还有用于和选项的功能

或者,如果只想操作特定选项,可以查看这些函数的实现方式,然后对特定选项使用相同的实现。例如,如果要直接调整,
tcp_setsockopt
执行此操作(在验证传入的值之后):


tcp_setsockopt
有一个参数
char\u user*optval
。有没有一种非黑客方式可以在内核空间中创建这种内存?我所看到的所有解决方法都涉及不良实践。这就是为什么我建议您查看选项实现,并在复制内存后执行实现所做的操作。但是对于你的问题,一个更直接的答案是有一个到用户空间内存的内存映射,你可以将args复制到该内存映射区域,并将指针传递到该内存映射区域。这是我希望避免的另一件事,因为我不知道将来会使用它的客户的内核版本。这被认为是一个好的做法吗?我担心我会在一个版本上实现这个过程,并且需要为另一个版本的客户更改它,因为我不仅仅调用这个函数。这似乎违反了基本封装。在我引用的示例中,
tcp\u set\u拥塞控制
在内核头
include/net/tcp.h
中可用。只要您坚持使用在
include
下发布的接口,我看不出有什么大问题。无论如何,任何内核模块都必须跟踪内核更改。保持对内核更改相对免疫的唯一方法是让代码完全驻留在用户空间中。
    lock_sock(sk);
    err = tcp_set_congestion_control(sk, name, true, true,
                     ns_capable(sock_net(sk)->user_ns,
                            CAP_NET_ADMIN));
    release_sock(sk);