我需要从内核空间对TCP套接字进行更改(尽管我想保持通用(。USB 驱动程序将收到一条消息,需要对给定的socket
结构进行此更改。
直接调用函数需要用户空间内存,解决方法不是我可以放置在生产环境中的东西。因此,直接打电话似乎不太可能。我看到的另一个解决方案是复制需要用户空间内存的部分,但这个解决方案也不是我想要投入生产的东西。
我正在考虑编写一个用户空间程序,通过procfs与驱动程序交谈并拨打电话。驱动程序会将数据放在文件中,以指示用户空间应用执行各种操作。
有没有更好的方法来实现这一目标?
根据选项,您可以从内核空间内调用sock_setsockopt
或tcp_setsockopt
。还有用于IPv4和IPv6选项的功能。
或者,如果您只想操作特定选项,则可以查看这些函数的实现方式,然后对特定选项使用相同的实现。例如,如果要直接调整TCP_CONGESTION
,tcp_setsockopt
执行以下操作(在验证传入的值之后(:
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);